题解
题目难度:中等难度
知识点:字符串、查找、数组、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;
}

京公网安备 11010502036488号