05| 数组存储运算结果:去除重复的数字
题目描述
给你N个数(n≤100),每个数都在(0~1000)之间,其中由很多重复的数字,请将重复的数字只保留一个,并将剩下的数由小到大排序并输出。
输入
输入有2行,
第1行为1个正整数,表示数的个数:N
第2行有N个用空格隔开的整数。
输出
第1行为1个正整数M,表示不相同数的个数。
接下来的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 i,n,a[110],x,j,t;
bool f;//用来标记读入的元素是否出现过
int k = 0;//表示目前数组中实际不重复的元素个数
cin>>n;
//i代表将要读入n个数,相当于是-一个计数器
for(i = 0;i < n;i++){
cin>>x;
//判断x在a数组中是否存在(a数组有k个元素)
f = false;//假设a数组中没有元素x
//循环a数组的k个元素
for(j = 0;j < k;j++){
if(a[j] == x){
f = true;
break;//停止当前循环
}
}
//如果数组a中没有元素x,则将x存入数组
if(f == false){
a[k] = x;
k++;
}
}
//排序
for(i = 1;i < k;i++){
for(j=0;j<=k-i-1;j++){
if(a[j] > a[j + 1]){
t = a[j];
a[j] = a[j + 1];
a[j +1] =t;
}
}
}
//输出
cout<<k<<endl;
for(i=0;i<k;i++){
cout<<a[i]<<endl;
}
getchar();
getchar();
}
思路二:以空间换时间
#include <iostream>
using namespace std;
int main(){
//用来统计那些数出现了
int a[1001]={0};
int n,x,i,c=0;
cin>>n;
for(i=0;i<n;i++){
cin>>x;//读入n个数
if(a[x]==0){
c++;
}
a[x]=1;//标记出现过
}
cout<<c<<endl;
//输出不重复的数
//也就是数组中非0元素的下标
for(i=0;i<1001;i++){
//输出非0下标
if(a[i]==1){
cout<<i<<endl;
}
}
getchar();
getchar();
}