怎样删除数组中的重复元素。

筛排处理 AC

 Tags:   root@172.22.237.2

Time Limit:  1 s      Memory Limit:   128 MB

Submission:3922     AC:1168     Score:66.38

SubmitCodes

Description

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N<=100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作

Input

每组输入数据的第一行含有一个正整数N,表示后面行中有N个随机整数。若N=0,表示处理结束。

Output

对应每组输入数据,输出一组数据,该数据由单独一行开头,内含一个N,表示后面有N个排好序的整数,整数之间空一格。每组输出数据之间空一行。

Samples

input Copy

12 2 4 6 17 20 40 43 45 60 64 85 98 17 35 75 40 61 56 21 85 61 50 83 52 22 44 68 51 80 38 0

output Copy

12 2 4 6 17 20 40 43 45 60 64 85 98 16 21 22 35 38 40 44 50 51 52 56 61 68 75 80 83 85

下面列出了两种方法。

法一是较为简便的一种。

法二使用方法较为普遍。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int cmp(const void* a, const void* b) {
	return *(int*)a - *(int*)b;
}
int main()
{
	int n;
	int tot;
	while (~scanf("%d", &n)) {
		if (n == 0) break;
		int a[110] = { 0 };
		for (int i = 0; i < n; i++)
			scanf("%d", &a[i]);
		qsort(a, n, sizeof(a[0]), cmp);
		tot = n;
//-------------------------------------法一:不修改原数组中的元素,碰见相同的元素即跳过,不同的元素再赋值给另一个数组;
		/*int b[110];
		int num = 0;
		for (int i = 0; i < n; i++) 
			if (a[i] != a[i + 1]) b[num++] = a[i];
		printf("%d\n", num);
		for (int i = 0; i < num; i++) printf("%d ", b[i]);
		printf("\n\n");*/

//--------------------------------法二:对a中的元素进行修改,碰见相同的数即开始修改;
		//此法可放在排序前,亦可放在排序后面。
		for (int i = 0; i < tot; i++) 
			for (int j = i + 1; j < tot; j++)
				if (a[j] == a[i]) {
					for (int u = j; u < tot; u++) 
						a[u] = a[u + 1];
					tot--;
					j--;//这个j--非常重要,若没有j--,当出现重复元素更改之后,j的值保留并加一,返回循环时无法确定是否原数组会出现三个以上元素连续且相等的情况。
				}
			
		
		printf("%d\n", tot);
		for (int i = 0; i < tot; i++) printf("%d ", a[i]);
		printf("\n\n");
	}
	return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值