You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode第42题代码返回后继续执行致数组越界问题排查

问题分析与解决方案

针对你遇到的LeetCode第42题(接雨水)在平台执行时的异常问题,结合本地VS Code运行正常的现象,核心排查方向和解决方法如下:

可能的原因

  1. 静态/全局变量残留状态:如果代码中使用了类级别的静态变量或全局变量,LeetCode平台多次调用方法时,变量状态不会自动重置,后续执行可能因旧状态导致数组索引越界。
  2. try-finally块的不当操作:若return语句放在try块中,finally块里存在数组索引访问逻辑,且索引计算错误,会在return执行后触发越界异常(本地可能因测试场景未暴露该问题)。
  3. 代码分支逻辑漏洞:return语句仅覆盖部分分支,其他分支未正确终止,导致后续代码执行时访问了无效数组索引。
  4. 提交代码与本地代码不一致:可能本地调试时注释了危险代码,但提交时未同步修改。

解决步骤

  1. 移除静态/全局变量:将所有变量移至方法内部,确保每次调用方法时状态完全独立。比如不要在Solution类中定义静态数组、计数器等。
  2. 清理try-finally块:检查finally块中是否有不必要的数组操作,若必须保留,确保索引计算严格满足0 <= 索引 < height.Length。
  3. 删除无法访问的代码:return语句后的代码属于无法访问的逻辑,直接删除即可(C#编译器会给出警告,这类代码无意义且可能引发异常)。
  4. 验证数组访问合法性:所有数组索引操作前,添加边界判断,比如:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:13:19