数组越界错误排查: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),直接触发越界错误。 - 逻辑不符合需求逻辑:假设这是要实现「移除有序数组中的重复项,保留每个元素唯一」的功能,原代码的双指针逻辑混乱——
curr和prev同步递增的设计,没有正确跟踪不重复元素的位置,同时多余的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。 - 避免越界:所有数组访问的索引都在
0到nums.Length-1范围内,不会触发越界错误。
测试示例
比如输入nums = [1,1,2,2,3],修复后的代码会将数组修改为[1,2,3,2,3],返回值为3,符合「保留3个不重复元素」的预期。
内容的提问来源于stack exchange,提问作者user3615760




