题目描述:
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
输入格式:
每组输入有2行,第1行为1个正整数,表示所生成的随机数的个数N,第2行有N个用空格隔开的正整数,为所产生的随机数。
输出格式:
每组输出也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
输入样例:
10
20 40 32 67 40 20 89 300 400 15
输出样例:
8
15 20 32 40 67 89 300 400
分析:
这里由题目便可以看出来是“去重”和“排序”的问题,我们的整体思路可以先排序后然后我们再去重。为什么会这样选择呢,因为当我们排好序后,数字是按照一定的大小顺序排列的。那么我们相同的数字一定是临近的,当我们将临近的一个数字由后面那个不相同的数字顶替掉时,即后一个数等于前一个数(这里特指位置前后,因为我们需要用到数组),也就是当出现相同数字时,后面整体数字往前移动一位。
代码展示:
#include<iostream>
using
namespace
std;
int
main() {
int
n, a[100];
cin >> n;
for
(
int
i = 0; i < n; i++)
//这里开始输入一段数组
{
cin >> a[i];
}
for
(
int
j = 0; j < n - 1; j++)
//这里开始冒泡排序,将数组按大到小排序
{
for
(
int
l = 0; l < n-j-1; l++) {
if
(a[l] > a[l + 1]) {
int
temp = a[l];
a[l] = a[l + 1];
a[l + 1] = temp;
}
}
}
for
(
int
b = 0; b < n-1;b++)
//这里去重复的数字
{
for
(
int
q = b + 1; q < n; q++) {
if
(a[b] == a[q]) {//当出现相同的时候
for
(
int
k = q; k < n - 1; k++)
a[k] = a[k + 1];//这里就是q后面的数(q+1所在位置的数)赋给q所在位置
n--;//这时候数组总长度减1
q--;//q也需要跟着一起减1
}
}
}
cout << n << endl;
for
(
int
m = 0; m < n; m++) {
cout << a[m] <<
" "
;
}
cout << endl;
return
0;
}
运行结果展示: