牛客题解 | 查找数组众数

题目

题目链接

题解

题目难度:中等难度

知识点:字符串、查找、数组、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&gt;&gt;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&lt;<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&gt;&gt;num;
        n++;
        v.push_back(num);   
    }
    sort(v.begin(),v.end());
    cout&lt;<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&gt;&gt;n;
        if (count == 0) num = n;
        count += (num == n ? 1 : -1);
        
    }
    cout&lt;</v[n></int></algorithm></vector></map></v[i];></count;i++){></int></int></vector></map></iostream>
posted @ 2025-03-10 10:07  wangxiaoxiao  阅读(19)  评论(0)    收藏  举报