C语言 去除数组中的重复数字

引言 有一维数组如下 arr[10]={60,15,20,20,32,10,55,40,40,40} 有重复数字,如何去重? 思路 一 排序 为了能够利用数字之间规律去重,先将数字进行排序,我们可以采用从小到大排序更为方便。排序的方法有很多,这里用最基础的冒泡排序,即用两个循环,将最大的值不断往前排

引言

有一维数组如下 arr[10]={60,15,20,20,32,10,55,40,40,40}

有重复数字,如何去重?

思路

一 排序

为了能够利用数字之间规律去重,先将数字进行排序,我们可以采用从小到大排序更为方便。排序的方法有很多,这里用最基础的冒泡排序,即用两个循环,将最大的值不断往前排。

for (int i = 0; i < 10-1; i++) {
    for (int j = 0; j < 10 - i - 1; j++) {
        if (arr[j] > arr[j + 1]) {
            // 交换相邻元素
            int temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}

二 去重

排序后数组如下arr[10]={10,15,20,20,32,40,40,40,55,60}

可以看重复的数字会连续出现,利用这个规律,我们可以对数组中的数字两两进行对比:

  • 10 和 15 不一样说明 10 没有重复,此时就可以把 10 放到 0 索引上,虽然形式上一样,但已经进行了代码操作;arr[10]={10,15,20,20,32,40,40,40,55,60}
  • 15 和 20 不一样说明 15 没有重复,此时就可以把 15 放到 1 索引上,虽然形式上一样,但已经进行了代码操作,arr[10]={10,15,20,20,32,40,40,40,55,60}
  • 20 和 20 一样说明重复了,无法确定后面还有没有,故不进行操作。arr[10]={10,15,20,20,32,40,40,40,55,60}
  • 20 和 32 不一样结合前面一项对比说明 20 没有再重复了,此时的 20 就是最后一个 20,可以把 20 放到 3 索引上进行替换,形式上仍然一样。arr[10]={10,15,20,20,32,40,40,40,55,60}
  • 32 和 40 不一样,故把 32 放在 4 索引上。arr[10]={10,15,20,32,32,40,40,40,55,60}
  • 40 和 40 一样,跳过。
  • 40 和 40 一样,跳过。
  • 40 和 55 不一样,将 40 放在 5 索引 arr[10]={10,15,20,32,40,40,40,40,55,60}
  • 55 和 60 不一样,将 55 放在 6 索引 arr[10]={10,15,20,32,40,55,40,40,55,60}

此时最后一个数字需要手动替换到 7 索引上,即arr[10]={10,15,20,32,40,55,60,40,55,60},另外还需要统计去重后有多少个数字,以方便遍历,重复的数字都堆到数组后边去了。

int j=0;
for(int i=0;i<10,i++0{
    if(arr[i]!=arr[i+1]{
        arr[j]=arr[i];
        j++;
    }
};
arr[j]=arr[9]

该算法名中的指针并非为内存地址指针,而是利用两个索引变量,i 进行顺序遍历,j 进行重新排序。

【人物访谈】义教:希望凭自己的能力让他们能够收获一些东西 2025-06-01
C语言 采药问题中的动态规划 2025-09-02

评论区