打印不重复数字

给出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;

}

posted @ 2020-11-26 23:41  empty_thought  阅读(248)  评论(0)    收藏  举报