求众数

Description

小明最近在上数学课,老师给小明布置了个作业:在n个数里找出所有的众数。
众数的定义是这样的:在所有数当中出现次数最多的数被称为众数。并且根据定义,众数有可能有多个。
你能解决这个问题吗?

Input

第一行一个整数 n。
第二行有 n个整数,i表示第i个数。

Output

输出一行,包括一个整数 k,表示众数的个数。
接下来一行包括k个整数,每个整数都表示一个众数,并且从小到大输出。

Sample Input

10

3 3 3 2 3 1 2 2 1 2

Sample Output

2
2 3

HINT

数据范围
40%的数据,1<=n<=400
100%的数据,1<=n<=1000000,1<=i<=1000000000

 

python解法

# 从用户输入中获取数字的数量
n = int(input())
# 从用户输入中获取一系列数字,并将它们转换为整数列表
numbers = list(map(int, input().strip().split()))

# 使用字典来统计每个数字的出现次数
count = {}
for num in numbers:
    # 如果数字已经在字典中,则增加其计数
    if num in count:
        count[num] += 1
    # 否则,将该数字添加到字典中,并设置其计数为1
    else:
        count[num] = 1

# 找到出现次数最多的次数
max_count = max(count.values())

# 初始化一个空列表来存储众数
modes = []
# 遍历字典的所有项
for num, cnt in count.items():
    # 如果当前数字的出现次数等于最多次数
    if cnt == max_count:
        # 将该数字添加到众数列表中
        modes.append(num)
# 对众数列表进行从小到大的排序
modes.sort()

# 输出众数的个数
print(len(modes))
# 将众数列表转换为字符串并输出,数字之间用空格分隔
print(' '.join(map(str, modes)))

c++解法

#include<bits/stdc++.h> // 包含了标准库中的许多头文件
using namespace std;

// 定义全局变量
long long p[1000001]; // 存储输入的数组
long long ans[100001]; // 存储出现次数最多的数字(可能有多个)

int main()
{
    int n, m = 0; // n为输入数字的数量,m为出现次数最多的数字的种类数
    int a = 0, b = 0; // a为当前数字连续出现的次数,b为目前记录的出现最多的次数
    long long c = p[0]; // c用于记录当前正在比较的数字,初始化为p[0]

    cin >> n; // 读取数字的数量

    // 读取输入的数字
    for(int i = 0; i < n; i++)
        cin >> p[i];

    // 对数组进行排序
    sort(p, p + n);

    // 遍历数组,统计每个数字的出现次数
    for(int i = 0; i < n; i++)
    {
        // 如果当前数字与前一个数字不同,则重置a
        if(c != p[i])
        {
            c = p[i];
            a = 0;
        }
        // 更新a为当前数字连续出现的次数
        else a++;

        // 如果当前数字的出现次数超过了之前的最大值b
        if(a > b)
        {
            b = a; // 更新b为新的最大值
            m = 0; // 重置m,因为之前的答案已经不再是最优的
        }

        // 如果当前数字是连续出现的,并且出现次数等于目前记录的最大次数b
        if(c == p[i] && a == b)
        {
            // 将这个数字添加到答案数组中
            ans[m] = p[i];
            m++;
        }
    }

    // 输出结果
    cout << m << endl; // 输出出现次数最多的数字的种类数
    for(int i = 0; i < m; i++)
    {
        cout << ans[i] << ' '; // 输出每个出现次数最多的数字
    }
    return 0;
}
如果您有更优的解法,欢迎在评论区一起交流噢~
阅读剩余
THE END