【力扣】力扣三数之和二次作答记录-难以察觉的错误

这里主要是记录一些我做这个题遇到的问题及解决办法

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:

超出内存限制
一般是因为程序中有死循环、或者无限递归

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值