牺牲空间来加快效率,对于一维数组num[M](M足够大),每次添加的数都做为数组的下标,例如输入10,则num[10]++,这样每次输入的数都可以找到自己在数组中的位置,而重复输入的数字i,num[i]的值就会自然的大于1.输出数组的时候,只输出下标i==1的值;因为下标肯定是按照大小排序,所以间接的达到了排序的目的。从而去重和排序一步到位。
由于只需要输入和输出都只需要一个循环,所以效率很高,但是在损失空间的基础上。
例题:
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他手动输入1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
输入格式:
第1行为1个正整数,表示所生成的随机数的个数:N
第2行输入N个需要用空格隔开的正整数随机数。
输出格式:
第1行为1个正整数M,表示不相同的随机数的个数。
第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
参考代码:
#include <stdio.h>
int main(void)
{
int array[1010]={0};
int num=0;
int i=0,tmp=0;
int length=0;
scanf("%d",&num);
for(i=0;i<num;i++)
{
scanf("%d",&tmp);
array[tmp]++;
if(array[tmp]==1)
length++;
}
printf("%d\n",length);
for(i=0;i<1010;i++)
{
if(array[i]!=0)
{
printf("%d ",i);
}
}
return 0;
}