十分感谢smile_zyk指正错误
way1:
将原数组排序,并且判断相邻的数字是不是有重复的即可
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1004;
int a[N], n, res;
int main(){
scanf("%d",&n);
for(int i = 1; i <= n; i++) scanf("%d",a+i);
sort(a+1,a+1+n);
res = n;
for(int i = 1; i<= n; i++)
if(a[i] == a[i-1])
res --;
printf("%d\n",res);
return 0;
}
way2 :
想到桶排序了吗?
没错这题可以用类似桶排序的方法做,
想象一下投票选班长:把每个人的名字列出来,你希望谁当班长,就给谁投票,最后只要统计谁有票(没票的当然就没戏咯),票最多的就是班长
(但是这题没有说明数组的大小,这种方法就不一定能过,但是这种思想还是值得借鉴的,并且这题的数据比较水,能过)
代码如下:
#include <iostream>
using namespace std;
const int N = 1005;
int f[N], n, x, res;
int main(){
cin>>n;
for(int i = 1; i <= n; i++) cin>>x, f[x] ++ ;
//如果这个箱子里面有票 就 res++
for(int i = 1; i < N; i++) if(f[i]) res ++;
cout<<res<<endl;
return 0;
}
一样的题,建议配套食用
为了让大家学到点东西,我就再换种方法,但其实用上面的方法照样能过,不过值得注意的是他输入不一定是升序(降序),所以输出也不一定是升序(降序),所以需要经过一些特殊处理,而且这题数据稍微大,经过这些处理可能是时间复杂度较高
这里是用标记法:一样的数组就标记,不输出就是了
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
bool b[20001];
int a[20001];
for(int i = 0; i < n ; i++)
cin>>a[i],b[i] = true;
for(int i = 0; i < n; i++)
for(int j = i + 1; j < n; j++)
if(a[j] == a[i])
b[j] = false;
for(int i = 0; i < n; i++)
if(b[i] == true)
cout<<a[i]<<' ';
return 0;
}
大佬,你的第一种方法好像不可以啊,题目中并没有说明整数的范围,你这样写是默认范围在0~1004之间
题目上说了n小于等于1000
题目中的N是数据的数量,而不是大小
哦对的,谢谢指正,我再看看有没有其他方法