求序列中的众数
描述
输入一个长度为N的整数序列 (不多于128个整数),每个整数的范围在[-1052,1052],计算这个序列的众数。
众数是指出现次数最多的那个数。
如果有多个数出现的次数都达到最多,则取在原序列最先出现的数为众数;如果所有的数都相等,则返回”no”。
题目本身没有什么好说的,主要是一些细节问题。
比如去掉前导0,但是 不能把 0000000000 去掉为 空……
还有,+0 = -0,这个也要注意。
特判后代码太丑了
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
char Num[150][270];
int Lgt[150],Crt,Cnt,Vis[150];
bool Cmp(int a,int b) {
if(Lgt[a] != Lgt[b]) {
return false;
}
for(int i = 1; i<=Lgt[a]; i++) {
if(Num[a][i] != Num[b][i]) {
return false;
}
}
return true;
}
int main() {
char a[275];
int n;
scanf("%d",&n);
for(int i = 1; i<=n; i++) {
scanf("%s",a + 1);
int j = 1,len = strlen(a + 1),Start = -1;
bool Minus = false;
for(int j = 1; j<=len; j++) {
if(a[j] == '-') {
Minus = true;
} else if(a[j] > '0' && a[j] <= '9') {
Start = j;
break;
}
}
if(Minus && Start != -1) {
Num[i][++Lgt[i]] = '-';
}
if(Start == -1) {
Start = len;
}
for(int j = Start; j<=len; j++) {
Num[i][++Lgt[i]] = a[j];
}
if(!Lgt[i]) {
Lgt[i] = 1;
}
}
int Pos = 0;
for(int j = 1; j<=n; j++) {
Cnt = 0;
if(!Vis[j]) {
for(int k = 1; k<=n; k++) {
if(Cmp(j,k) && !Vis[k]) {
Vis[k] = 1;
Cnt++;
}
}
}
if(Crt < Cnt) {
Crt = Cnt;
Pos = j;
}
}
if(Crt != n) {
for(int j = 1; j<=Lgt[Pos]; j++) {
cout<<Num[Pos][j];
}
} else {
cout<<"no";
}
return 0;
}