You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

数组越界错误排查:RemoveDuplicates函数部分输入报错问题

排查并修复RemoveDuplicates函数的数组越界错误

我来帮你搞定这个问题!你遇到的offset and length are out of bound for array or count is greater than错误,本质是数组索引越界了,咱们先拆解原代码的问题,再给出修复方案:

错误根源分析

你的代码逻辑存在两个核心问题:

  • 数组索引越界触发点:代码里的条件nums[i] > nums[curr],当curr增长到等于nums.Length时,访问nums[curr]就会超出数组的合法索引范围(数组索引从0到nums.Length-1),直接触发越界错误。
  • 逻辑不符合需求逻辑:假设这是要实现「移除有序数组中的重复项,保留每个元素唯一」的功能,原代码的双指针逻辑混乱——currprev同步递增的设计,没有正确跟踪不重复元素的位置,同时多余的nums[i] > nums[curr]判断完全没必要(因为有序数组中只要元素不等于最后一个不重复元素,就是新的有效元素)。

修复后的代码方案

下面是修正后的双指针实现,完全解决越界问题,同时符合有序数组去重的需求:

public int RemoveDuplicates(int[] nums) {
    // 先处理边界情况:空数组或单元素数组直接返回对应长度
    if (nums == null || nums.Length == 0) return 0;
    if (nums.Length == 1) return 1;
    
    int lastUniqueIndex = 0; // 指向当前已处理好的不重复序列的最后一个元素
    for (int i = 1; i < nums.Length; i++) {
        // 当当前元素和最后一个不重复元素不同时,更新不重复序列
        if (nums[i] != nums[lastUniqueIndex]) {
            lastUniqueIndex++; // 移动到下一个待填充的位置
            nums[lastUniqueIndex] = nums[i]; // 把当前元素放到新位置
        }
    }
    // 不重复元素的个数是最后一个索引+1
    return lastUniqueIndex + 1;
}

代码解释

  • 边界处理:先判断空数组和单元素数组,避免后续循环出现不必要的错误。
  • 双指针逻辑lastUniqueIndex始终跟踪不重复序列的最后位置,i遍历整个数组,只要发现当前元素和lastUniqueIndex指向的元素不同,就把它放到lastUniqueIndex+1的位置,然后更新lastUniqueIndex
  • 避免越界:所有数组访问的索引都在0nums.Length-1范围内,不会触发越界错误。

测试示例

比如输入nums = [1,1,2,2,3],修复后的代码会将数组修改为[1,2,3,2,3],返回值为3,符合「保留3个不重复元素」的预期。

内容的提问来源于stack exchange,提问作者user3615760

火山引擎 最新活动