双指针法提取ArrayList唯一元素:代码为何缺失首个预期元素?
代码问题分析与修复
核心问题1:连续重复元素未被加入结果
当数组中存在连续重复的元素(比如开头的7),你的代码仅跳过了所有重复项,但没有将该唯一元素添加到结果列表。例如,若原数组开头是[7,7,56,...],进入else if分支后,p1会直接跳到第一个非7的位置,但7从未被加入ans,这就是首个元素缺失的原因。
核心问题2:最后一个元素可能被遗漏
循环条件p1 <= N-2限制了p1最多只能到数组的倒数第二个元素,当p1走到N-1(最后一个元素)时,循环直接终止,若该元素是唯一的,就会被遗漏。
修复后的代码
public static ArrayList<Integer> Unique_element (ArrayList<Integer> A){ int N = A.size(); ArrayList<Integer> ans = new ArrayList<>(); if (N == 0) return ans; // 处理空数组边界 int p1 = 0; while(p1 <= N-2){ if(!A.get(p1).equals(A.get(p1+1)) ){ ans.add(A.get(p1)); p1++; } else { int left = A.get(p1); // 跳过所有重复项 while(p1 < N && A.get(p1).equals(left)){ p1++; } // 将当前唯一元素加入结果 ans.add(left); } } // 处理最后一个未被遍历的元素 if(p1 == N-1){ ans.add(A.get(p1)); } return ans; }
修复说明
- 在跳过重复元素的分支中,新增
ans.add(left),确保连续重复的唯一元素被加入结果。 - 循环结束后增加判断,处理最后一个未被循环覆盖的元素。
- 添加空数组的边界判断,避免索引越界异常。
内容的提问来源于stack exchange,提问作者Ashish Thomas
相关产品推荐
相关产品推荐

