LeetCode第42题代码返回后继续执行致数组越界问题排查
问题分析与解决方案
针对你遇到的LeetCode第42题(接雨水)在平台执行时的异常问题,结合本地VS Code运行正常的现象,核心排查方向和解决方法如下:
可能的原因
- 静态/全局变量残留状态:如果代码中使用了类级别的静态变量或全局变量,LeetCode平台多次调用方法时,变量状态不会自动重置,后续执行可能因旧状态导致数组索引越界。
- try-finally块的不当操作:若return语句放在try块中,finally块里存在数组索引访问逻辑,且索引计算错误,会在return执行后触发越界异常(本地可能因测试场景未暴露该问题)。
- 代码分支逻辑漏洞:return语句仅覆盖部分分支,其他分支未正确终止,导致后续代码执行时访问了无效数组索引。
- 提交代码与本地代码不一致:可能本地调试时注释了危险代码,但提交时未同步修改。
解决步骤
- 移除静态/全局变量:将所有变量移至方法内部,确保每次调用方法时状态完全独立。比如不要在
Solution类中定义静态数组、计数器等。 - 清理try-finally块:检查finally块中是否有不必要的数组操作,若必须保留,确保索引计算严格满足
0 <= 索引 < height.Length。 - 删除无法访问的代码:return语句后的代码属于无法访问的逻辑,直接删除即可(C#编译器会给出警告,这类代码无意义且可能引发异常)。
- 验证数组访问合法性:所有数组索引操作前,添加边界判断,比如:
if (i >= 0 && i < height.Length) { // 执行数组访问 }
正确参考实现
以下双指针写法可确保本地和LeetCode平台均正常运行,测试数组[0,1,0,2,1,0,1,3,2,1,2,1]会正确返回6:
public class Solution { public int Trap(int[] height) { if (height == null || height.Length <= 2) return 0; int left = 0, right = height.Length - 1; int leftMax = height[left], rightMax = height[right]; int result = 0; while (left < right) { if (leftMax < rightMax) { left++; if (height[left] < leftMax) { result += leftMax - height[left]; } else { leftMax = height[left]; } } else { right--; if (height[right] < rightMax) { result += rightMax - height[right]; } else { rightMax = height[right]; } } } return result; } }
内容的提问来源于stack exchange,提问作者Physalis
相关产品推荐
相关产品推荐

