求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
相关产品推荐
相关产品推荐

