C语言数组移位去重时如何包含匹配索引,避免跳过首个重复位置
问题根因
原代码的核心问题是:当检测到array[j]为重复值并完成左移覆盖操作后,直接执行了++j,此时原本位于j+1的元素已经被移动到了j的位置,这个新的array[j]没有和array[i]做重复校验,就会跳过该位置的重复元素,也就是你遇到的漏处理首个匹配重复索引的问题。
修复代码
仅需要调整j的自增逻辑,仅在当前j位置元素不重复时再后移指针即可:
int k, i = 0, j; while (i < size){ j= i+1; while (j < size){ if (array[i] == array[j]) { for (k = j; k < size-1; k++) { array[k] = array[k+1]; } array[k] = 0; // 重复处理后不移动j,当前位置已替换为新元素需重新校验 } else { ++j; } } ++i; }
逻辑验证示例
以原数组[2, 3, 2, 2, 5]、size=5为例:
- i=0,
array[i] = 2,j从1开始遍历- j=1:3≠2,j自增到2
- j=2:2==2,左移覆盖后数组变为
[2,3,2,5,0],j保持2不变 - 再次校验j=2:2==2,左移覆盖后数组变为
[2,3,5,0,0],j保持2不变 - 再次校验j=2:5≠2,j自增到3
- 后续j=3、j=4的元素均为0,无重复,内层循环结束
- 后续i=1、i=2遍历无重复值,最终输出为
[2,3,5,0,0],符合需求。
内容的提问来源于stack exchange,提问作者user17075469
相关产品推荐
相关产品推荐

