排序后去重可单次遍历完成,因相同元素相邻,只需比较当前与前一元素是否相等;用双指针原地去重,时间O(n)、空间O(1),但须先正确排序。

排序后去重,单次遍历就能完成——关键是利用已排序数组的相邻元素重复特性,跳过连续相同的值即可。
为什么排序后能单次遍历去重
数组升序(或降序)排好后,相同元素必然相邻。因此只需比较当前元素和前一个元素是否相等:若不等,就是新元素;若相等,说明是重复项,跳过。
核心实现逻辑(原地去重 + 返回新长度)
用双指针思想:一个指针 i 遍历整个数组,另一个指针 writeIndex 指向去重后最后一个有效位置。从索引 1 开始遍历,每次检查 arr[i] !== arr[i - 1],成立则把 arr[i] 复制到 arr[writeIndex++]。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 时间复杂度:O(n),仅一次 for 循环
- 空间复杂度:O(1),原地修改,不额外申请数组
- 注意:需先调用
arr.sort((a, b) => a - b)(数字)或arr.sort()(字符串),否则逻辑不成立
完整可运行示例
const arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3];
arr.sort((a, b) => a - b); // [1, 1, 2, 3, 3, 4, 5, 5, 6, 9]
let writeIndex = 1;
for (let i = 1; i if (arr[i] !== arr[i - 1]) {
arr[writeIndex++] = arr[i];
}
}
arr.length = writeIndex; // 截断数组
// arr 现在是 [1, 2, 3, 4, 5, 6, 9]
立即学习“Java免费学习笔记(深入)”;
注意事项与边界处理
- 空数组或单元素数组:循环不执行,直接返回原数组(安全)
- 全相同元素(如
[5,5,5]):最终writeIndex为 1,arr.length = 1,结果正确 - sort 的 compareFn 必须稳定:数字务必用
(a,b) => a-b,避免字符串默认排序导致10 < 2这类错误 - 若需保留原数组,应先
const sorted = [...arr].sort(...)再去重

















