求序列中的众数

描述
输入一个长度为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;
}
posted @ 2018-03-17 15:38  WenOI  阅读(813)  评论(0编辑  收藏  举报
水波背景