You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:15:03