打印不重复数字
给出N个数,要求把其中重复的去掉,只保留第一次出现的数。
例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 6 5 4。
输入
输入第一行为正整数T,表示有T组数据。
接下来每组数据包括两行,第一行为正整数N,表示有N个数。第二行为要去重的N个正整数。
输出
对于每组数据,输出一行,为去重后剩下的数字,数字之间用一个空格隔开。
1 <= N <= 50000,给出的数在32位有符号整数范围内。
这一题用计数排序不太合适,因为输入的数有32位,开的数组比较大,当前可以用检索的方法, 一种是全部输入完检索,一种输一个检索一个,前者的工作量就比较大,后者的想法更好一点
int T;
scanf("%d",&T);
while(T>0)
{
int a[5000]={0};
int n;
scanf("%d",&n);
int nums=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
nums++;
}
for(int j=0;j<nums-1;j++)
{
while(a[j]==a[nums-1]) nums--;//确保最后一个数字不是相同数字
for(int i=j+1;i<nums;i++)
{
while(a[j]==a[i])//当出现重复数字,就用最后一个覆盖相同的数字,然后数组长度减一
{
for(int x=i;x<nums-1;x++)
a[x]=a[x+1];
nums--;
}
}
}
for(int i=0;i<nums;i++)
printf("%d ",a[i]);
printf("\n");
T--;
}
//接下来是第二种算法
include <stdio.h>
define N 50000
int a[N], acount;
int find(int v)
{
int i;
for(i=0; i<acount; i++)//遍历数组之前存过的数
if(v == a[i]) //出现重复数字
return 1;//返回1则不打印该数
return i != acount;//i等于account,返回0
}
int main(void)
{
int t, n, v, outcount;
scanf("%d", &t);//t是输入的组数
while(t--)
{
acount = 0;
outcount = 0;
scanf("%d", &n);//一组输入的数字
while(n--)
{
scanf("%d", &v);
if(!find(v))
{
a[acount++] = v;//将数按顺序存入数组
if(outcount++ != 0)
printf(" ");//打印除第一个数前面的空格,将数字隔开
printf("%d", v);
}
}
printf("\n");
}
return 0;
}

浙公网安备 33010602011771号