前言:hello,各位小伙伴们,今天的内容是序列中整数去重的解法介绍,下面进入正题吧!
描述
输入n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的整数,只保留该数第一次出现的位置,删除其余位置。
输入描述:
输入包含两行,第一行包含一个正整数n(1 ≤ n ≤ 1000),表示第二行序列中数字的个数;第二行包含n个整数(范围1~5000),用空格分隔。
输出描述:
输出为一行,按照输入的顺序输出去重之后的数字,用空格分隔。
示例1
输入:
5 10 12 93 12 75
输出:
10 12 93 75
我的代码:
#include <stdio.h>
int main()
{
int n=0;
int arr[1000]={0};
scanf("%d",&n);
int i=0;
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
for(i=0;i<n;i++)
{
int j=0;
for(j=i+1;j<n;j++)
{
if(arr[i]==arr[j])
{
//去重-后面的覆盖前面的
int k=0;
for(k=j;k<n-1;k++)
{
arr[k]=arr[k+1];
}
n--;//去重后 个数少一
j--;
}
}
}
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
大致思路:
1.每个数字都要进行判断 是否有出现和自己一样的数字,第2个for循环的作用就是如此
代码如下:
for(i=0;i<n;i++)
2.第3个for循环的作用是弄出一个正在进行查重数字后面的所有数字
形象一点,我们可以这样想象:一个正在进行查重的数字 是本尊,对于本尊这个数字而已,它后面排着的所有数字都是嫌疑人,代码如下:
int j=0;
for(j=i+1;j<n;j++)
3.若是嫌疑人中出现和本尊一样的,那就进行去重操作:用这个嫌疑人后面的人来覆盖,代码如下:
if(arr[i]==arr[j])
{
//去重-后面的覆盖前面的
int k=0;
for(k=j;k<n-1;k++)
{
arr[k]=arr[k+1];
}
n--;
j--;
}
注意:
a.k原本的逻辑是 :k<n,但是因为有arr[k+1],则k最大达到n-1,k+1=n,造成数组访问越界,故要写成:k<n-1,则k最大达到n-2,k+1=n-1。
b. 不要忘记进行一次去重操作后j--
j--的含义:当一个嫌疑人进行去重操作后,覆盖上来的数字可能也是和本尊一样的数字,j--后,马上进行是j++,(在这个位置上先退后一步,再前进一步==原地不动)这样就可以再次对这个被覆盖新值的位置进行判断有无重复
4.最后一个for循环打印出删除查重数字后的数组
本期完!下次再见。