这里主要是记录一些我做这个题遇到的问题及解决办法
1.问题
1.1 问题1:
下面两行代码有什么区别?
// 1
if (i > 0 && nums[i] == nums[i - 1])
// 2
if (nums[i] == nums[i - 1] && i > 0)
根据C语言运行顺序从左到右,那么第一行可以避免数组越界的情即i==0时。
但是第二个则不能避免,第二个在i==0时会报错,因为先运行第一个判断条件,
这个错误暴漏了我对C的不了解......、
1.2 问题2
在对第left,right对应的值进行去重时,下面两种写法分析
写法1
while (left < right && nums[left]== nums[left+1])
{
left++;
}
while (left < right && nums[right] == nums[right-1])
{
right--;
}
如果只是单独考虑上述例制,例如对于-7,-7,-7,0,7,7,7这种写法会跳出循环,跳出循环后,
最终到 -7,0,7这里,但是把代码补全如下:
while(left<right)
{
........
.........
while (left < right && nums[left]== nums[left+1])
{
left++;
}
while (left < right && nums[right] == nums[right-1])
{
right--;
}
}
上述上述写法显然是错误的,会出现死循环的情况,因为内循环只能判断到-7,0,7,
left<right是恒成立的,把其改成下面的形式就可以了:
写法2
while(left<right)
{
........
.........
nums1 = nums[left];
nums2 = nums[right];
while (left < right && nums1 == nums[left])
{
left++;
}
while (left < right && nums2 == nums[right])
{
right--;
}
}
2.常见问题汇总:
2.1 错误提示1:
**ERROR: AddressSanitizer: heap-buffer-overflow on address 0x603000000058 at pc 0x55633b2446d5 bp 0x7ffe292dd280 sp 0x7ffe292dd270**
一般都是由于数组超越边界或者指针指出边界,或者检查申请内存是否赋值正确
2.2 错误提示2:
超出内存限制
一般是因为程序中有死循环、或者无限递归