LeetCode有序平方数组问题中C++运行时溢出错误排查与修复咨询
分析并解决你的有序平方数组问题中的运行时错误
首先,咱们来拆解你遇到的两个核心问题:
1. 为什么start<=end会导致溢出错误?
你的else if(abs(nums[start])==abs(nums[end]))分支存在逻辑漏洞:当start == end时(也就是数组只剩最后一个元素需要处理),你仍然执行了两次finalIdx--和两次数组赋值操作。举个例子,假设数组长度是1(比如[-5]),初始finalIdx是0,第一次赋值final[0]没问题,但紧接着finalIdx变成-1,然后你尝试给final[-1]赋值——这直接访问了数组边界外的内存,触发了你看到的unsigned offset overflow错误。
2. 为什么start<end时第一个元素是0?
你犯了一个超级容易忽略的错误:return final;写在了while循环的内部!这意味着循环只执行一次就直接返回结果了,剩下的数组元素根本没被赋值,保持了vector默认的初始值0,所以你看到第一个元素总是0。
修正后的代码
下面是修复了这两个问题的版本,我会标注关键修改点:
class Solution { public: vector<int> sortedSquares(vector<int>& nums) { int start = 0; int end = nums.size()-1; vector<int> final(nums.size()); int finalIdx = final.size()-1; int sqr = 0; while(start <= end){ if (abs(nums[start]) < abs(nums[end])){ sqr = nums[end] * nums[end]; final[finalIdx] = sqr; finalIdx--; end--; } else if (abs(nums[start]) > abs(nums[end])){ sqr = nums[start] * nums[start]; final[finalIdx] = sqr; finalIdx--; start++; } else { // 处理相等的情况,合并成else更简洁 sqr = nums[end] * nums[end]; final[finalIdx] = sqr; finalIdx--; // 只有当start和end不是同一个位置时,才处理start的元素 if (start != end) { final[finalIdx] = sqr; finalIdx--; start++; } end--; // 不管是否是同一个位置,end都要减1;如果start==end,循环会结束 } } return final; // 把return移到循环外面,确保整个数组处理完成 } };
关键修改说明
- 移动return语句:把
return final;放到while循环结束之后,这样循环能完整遍历所有元素,完成整个数组的赋值。 - 修复相等分支的逻辑:当
start == end时,只赋值一次,避免越界;只有当start != end时,才赋值两次(因为此时start和end指向两个不同的元素,绝对值相等,平方也相等)。 - 简化条件判断:把最后一个
else if改成else,因为前面两个条件已经覆盖了小于和大于的情况,剩下的必然是相等的情况,代码更简洁。
这样修改后,不管数组长度是奇数还是偶数,都能正确处理,不会出现溢出或者未赋值的问题。
内容的提问来源于stack exchange,提问作者R S
相关产品推荐
相关产品推荐

