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

求C语言非有序数组去重拷贝完整代码(支持非连续重复)

解决数组去重并拷贝到新数组的问题(支持非有序、非连续重复)

嘿,我来帮你搞定这个问题!你遇到的“结果数组始终是原数组最后一个元素重复N次”的问题,大概率是因为嵌套循环里的索引逻辑出错了——比如没区分开原数组的遍历索引和新数组的存储索引,或者重复检查的逻辑没写对,导致新数组的元素一直被覆盖。

先给你能直接运行的完整代码,完美支持非有序数组、非连续重复的情况:

#include <stdio.h>

// 辅助函数:检查元素val是否已经存在于数组arr中,arr的有效长度为len
int isDuplicate(int val, int arr[], int len) {
    for (int i = 0; i < len; i++) {
        if (arr[i] == val) {
            return 1; // 找到重复,返回1
        }
    }
    return 0; // 没有重复,返回0
}

int main() {
    // 测试用例:包含非连续重复元素的非有序数组
    int originalArray[10] = {1, 2, 3, 2, 5, 3, 7, 8, 9, 10};
    int newArray[10]; // 新数组,大小和原数组一致避免溢出
    int newLen = 0; // 新数组的有效元素长度

    // 遍历原数组的每个元素
    for (int i = 0; i < 10; i++) {
        // 检查当前元素是否已经在新数组中存在
        if (!isDuplicate(originalArray[i], newArray, newLen)) {
            newArray[newLen] = originalArray[i];
            newLen++; // 新数组长度加1
        }
    }

    // 输出结果
    printf("原数组:");
    for (int i = 0; i < 10; i++) {
        printf("%d ", originalArray[i]);
    }
    printf("\n去重后的新数组:");
    for (int i = 0; i < newLen; i++) {
        printf("%d ", newArray[i]);
    }
    printf("\n");

    return 0;
}

代码关键逻辑说明:

  • 辅助函数isDuplicate:专门用来校验当前元素是否已经被加入新数组,不管重复元素是不是连续的、数组有没有排序,都能准确判断。
  • 新数组索引管理:用newLen变量跟踪新数组的有效元素个数,每加入一个不重复的元素,newLen就递增,确保每个新元素都存在新的位置上,不会覆盖之前的正确元素。
  • 遍历逻辑:外层循环逐个遍历原数组元素,对每个元素先做重复检查,只有不重复的时候才添加到新数组里,完全符合你的需求。

你原代码出错的可能原因:

你之前的嵌套循环可能犯了这些错误之一:

  • 没有单独维护新数组的索引,而是直接用原数组的索引赋值,导致重复元素覆盖了之前的正确元素;
  • 当发现重复时,错误地跳过了外层循环的索引递增,导致原数组的同一个元素被反复处理;
  • 重复检查的逻辑有误,比如只检查了相邻元素,没检查新数组里已经存在的所有元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:04:39