查找数字众数
查找数组众数
http://www.nowcoder.com/questionTerminal/3584a44114ea4805a9f6814e99285835
题解
题目难度:中等难度
知识点:字符串、查找、数组、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; }