Leetcode 1089 Duplicate Zeros 算法输出异常bug排查
Bug分析
- 第一个核心错误:第一次遍历的边界判断逻辑完全失效,你写的
if(item == arr.length)永远不可能触发,因为循环的终止条件是item <= arr_length,而arr_length初始值是arr.length - 1,后续还会不断递减,item永远不可能等于arr.length。 - 这个错误导致你计算的
possible_duplicates(需要复写的零的数量)和arr_length(原数组中最后一个需要保留的元素索引)完全错误,最终第二次倒序赋值的时候,把原数组前面的非零元素错误移位到了后面的位置,就出现了你拿到的[8,8,4,5,0,0,0,0]错误结果。
修正后的代码
class Solution { public void duplicateZeros(int[] arr) { int possible_duplicates = 0; int n = arr.length; int left = 0; // 第一次遍历:计算需要复写的零的数量,以及最后一个保留元素的索引 while (left + possible_duplicates < n) { if (arr[left] == 0) { // 边界情况:当前零刚好占最后一个位置,无法复写 if (left + possible_duplicates == n - 1) { arr[n - 1] = 0; n--; break; } possible_duplicates++; } left++; } int last = left - 1; // 第二次倒序遍历:原地赋值 for (int i = last; i >= 0; i--) { if (arr[i] == 0) { arr[i + possible_duplicates] = 0; possible_duplicates--; arr[i + possible_duplicates] = 0; } else { arr[i + possible_duplicates] = arr[i]; } } } }
验证结果
输入测试用例[8,4,5,0,0,0,0,7],运行修正后代码可得到预期输出[8,4,5,0,0,0,0,0]。
内容的提问来源于stack exchange,提问作者user8426766
相关产品推荐
相关产品推荐

