力扣问题总结

说明:此文章仅是作者刷力扣题库的一点点总结。很多地方肯定写的不够好。
因为作者基础很菜,在总结的过程中存在很多不足或者比较低级问题的地方还望见谅,
也希望同道中人在发现文章存在问题或者不足的地方给予批评指正。

问题:

题(3): 两数之和–给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

问(1):int* twoSum(int* nums, int numsSize, int target, int* returnSize)中== returnsize ==是什么意思?

答:

returnsize的作用是返回,告知调用者结果数组的大小。

题(3): 两数相加–给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

问(2):错误提示:load of null pointer of type ‘const int’ .

答:

在调用函数时,如果返回值如果是一个常量则没问题。
如果返回值若为指针则可能会出现该错误,假如返回的指针地址指向函数内的局部变量,在函数退出时,
该变量的存储空间会被销毁,此时去访问该地址就会出现这个错误。

解决办法有以下三种:
1.返回的指针使用malloc分配空间
2.将该变量使用static修饰 static修饰的内部变量作用域不变 但是声明周期延长到程序结束 即该变量在函数退出后仍然存在
3.使用全局变量[^1]

题(3): 无重复字符的最长子串:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

问1:定义的一个指向字符类型的指针(char *s),如何使用里面的字符?

答1:

	可以直接按照s[i]的形式使用,其中i为元素所在的位置。

问2:题中使用的是何种方法?如"abcabca"

答2:

使用的是窗口滑动法:	先固定最左边位置K和一个右边界位置L(初始值和左边界一样),
		由此便形成了一个(L-K)这么大的一个窗口,
		后面依次向后查找右边界即第L个位置上的字符(第一个for循环,右边界加一,即窗口大小加一,同时记录窗口大小)
		判断其是否与其前面的某个字符M相同,
		若是,则将光标(左边界)移到第一个与该相同字符M所在位置的下一个位置;(第二个for,相等则重新设置左边界K)
		否则,不用做任何处理,跳转到第一个for,增加窗口的大小并记录。

题(7):整数反转:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

问1:如何翻转?

答1:

对原数求余,将这次的余数乘10,再与下一次的余数相加即可。

问2:如何判断翻转后是否溢出?

答2:

若是正数,则判断翻转结束前的一次temp值的大小和最大范围值/10 进行比较,若前者大于后者,则溢出。
若前者小于后者,则未溢出。若相等,再判断余数是否大于7,若是则溢出,反之就未溢出。
若是负数,则判断翻转结束前的一次temp值的大小和最大范围值/10 进行比较,若前者小于后者,则溢出。
若前者大于后者,则未溢出。若相等,再判断余数是否小于(-8),若是则溢出,反之就未溢出。

题(9):判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。如:121,7997,2这些翻转后还是本身的数。

问1:思路是什么?

答1:

 法一:可以看到,回文数的左半边数等于右半边数的反转。所以大体思路是将后面一半采用反转的方法反转后,
再与前半边的数进行比较。若相等,即是回文数,否则不是。
当然重点是如何判断一个数一半所在的位置在何处。
如果该数的位数是奇数个,则其左半边的数以及中位数组成的数是大于右半边反转后的数乘以10,
如数121,12大于1*10=10的,右边的1等于12/10=1的(所以可以以此作为判别位置的条件)
如果该数的位数是偶数个,则其左半边的数是大于右半边反转后的数,也就是在这之前,左边的数一直大于右边的数的反转
如8998,899最开始大于8,后面89大于等于98的翻转---89的,所以可以以此作为判断一半所在位置的条件。
法二:将数字求余放进数组,判断数组首位两个数是否相等,依次将范围往中间缩小,判断第二个和倒数第二个数是否相等,依次循环下去。一旦发现不等,立马返回false。否则继续。

题(9):盛水最多的容器:给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

问1:思路是什么?

答1:

法一:双指针法:将两指针分别置于收尾,若右指针小于等于左指针所在位置的液体高度,
则将右指针左移,一位继续遍历并记录矩形面积大小。
当左指针所在位置的高度小于右指针所在位置的高度,则停止此次循环遍历,将左指针右移一位,右指针置于最右侧,
继续循环遍历,一旦发现左指针所在位置K的高度A小于右指针所在位置L的高度B,则又重复上一步。
此时构成的面积大小为A*(L-K),为什么能停止呢?
因为A

题(10):整数转罗马数字

问1:思路是什么?

答1:

先构造应该含数字和字符的结构体或者两个数组,一个存放整数,一个存放对应的字符。这些字符数字是题中所说的特例。
然后对输入数字判断其与特例中数字的大小,若大于,则将其复制存放于某个数组,用输入数字减去该数字,
所得的差继续在结构体或者数组中按此法进行判断,直至结束。用strcat函数可连接两个字符串。

你可能感兴趣的:(bug)