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

使用单循环对无需排序的数组去重,现有代码运行结果不符合预期

问题分析

你的现有逻辑本质仍是有序数组的连续去重思路,存在两个明显缺陷:

  • 仅对比当前遍历值和上一个记录值,没有校验当前值是否已经在之前的结果中出现过,无法处理非连续的重复元素(比如示例中4之后再次出现的3、8之后再次出现的1)
  • 循环结束后没有将最后一个待存入的元素写入结果数组,会丢失末尾的元素(示例中最后的2就没有出现在输出里)

解决思路

要实现无需排序的单循环去重,可以引入一个标记集合记录已经出现过的元素,遍历每个元素时仅需查询标记集合即可判断是否要保留该值,整体时间复杂度为O(n)。针对整数场景可以直接用数组作为标记容器,实现非常简单。

注:如果元素包含负数或取值范围较大,可调整标记数组的下标偏移,或替换为哈希表实现存在性校验,单循环的核心逻辑无需改动。

修改后代码

code.c

#include <stdio.h>

#define size 20
#define true 1
#define false 0
// 标记数组大小根据元素最大可能值调整,此处示例适配输入的元素范围
#define MAX_VAL 100

int main() {
    int input[size] = {1, 3, 3, 3, 3, 3, 4, 3, 3, 3, 5, 6, 7, 8, 1, 1, 1, 1, 2, 2};
    // 标记数组,记录值是否已经出现过
    int existed[MAX_VAL] = {0};
    int index = 0;
    
    // 单循环实现去重
    for (int x = 0; x < size; x++) {
        int cur = input[x];
        if (existed[cur] == false) {
            existed[cur] = true;
            input[index++] = cur;
        }
    }
    
    // 输出结果
    for (int foo = 0; foo < index; foo++) {
        printf("%d", input[foo]);
        printf((foo != index - 1) ? ", " : "");
    }
    
    return 0;
}

运行结果

输入和你提供的示例一致时,输出为:

1, 3, 4, 5, 6, 7, 8, 2

符合无序去重的需求,且全程仅用了一次遍历主循环。

内容的提问来源于stack exchange,提问作者user15242190

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:18:02