题解

题目难度:中等难度

知识点:字符串、查找、数组、map、排序

首先考虑:将输入的字符串进行拆分转化为数组(该过程见代码)
该题方法众多,这里给出几种较好的方法:

方法(一)

采用map和vector两种数据结构,用vector存储字符串中出现的所有数字,用map存储所有数字出现的次数,遍历map中出现的所有数字,判断该数字出现的次数,如果大于n/2,说明该数字为众数,打印并退出循环。

#include<iostream>
#include<map>
#include<vector>
using namespace std;
int main()
{
    int num;
    int n=0;//字符穿中数字的总数 
    vector<int> v;//保存字符串中所有出现的数 
    int count=0;//记录一共存在多少个不同的数 
    map<int ,int> m;//保存每个数出现的次数 
    int i=0;
    while(getchar()!=']')
    {
        cin>>num;
        n++;
        if(m.count(num) == 0) {
            v.push_back(num);
            count++;
        }
        m[num]++;    
    }
    for(int i=0;i<count;i++){
        num=v[i];
        if(m[num]>n/2){
             cout<<v[i];
             break;
        }
    }
    return 0;
}

方法(二)

将字符串中出现的所有数字排序,由于众数超过一半的数字,那么排序后必然中位数为众数。

#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    int num;
    int n=0;//字符穿中数字的总数 
    vector<int> v;//保存字符串中所有出现的数 
    int i=0;
    while(getchar()!=']')
    {
        cin>>num;
        n++;
        v.push_back(num);   
    }
    sort(v.begin(),v.end());
    cout<<v[n/2]; 
    return 0;
}

方法(三)

根据众数特点,每次消去两个不相同的数字,偶数时最后剩下的两个数,必然相同,该数为众数,若为奇数时,最终剩下的数为众数。
如测试用例[3,1,-2,3,1,3,3] ,由于每输入一个数字,都会进行比较消除。
首先,count初始化为0。
步骤一:该数字为判断的第一个数字用num进行记录,那么仅仅设置count=1,记录当前数字出现了一次;
步骤二:当不是第一个数字时,新进来的数字与之前数字比较:
1.相同,那么数字num个数增加1,即count++
2.不同,那么数字num所对应的count-1;如果count-1之后值为0,那么把下一个输入的数字赋值给num,按第一步执行。若count-1之后不为0,那么传入下一个数字,即按照步骤二执行。
结束情况:当所有的数都进行比较后,最终保留下来的那个数num便是众数。

#include<iostream>
using namespace std;
int main()
{
    int count=0;
    int num;
    int n;//字符串中依次得到的数字 
    while(getchar()!=']')
    {
        cin>>n;
        if (count == 0) num = n;
        count += (num == n ? 1 : -1);

    }
    cout<<num;
}