求众数
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;
}
如果您有更优的解法,欢迎在评论区一起交流噢~
阅读剩余
作者:小鱼
链接:https://www.52stu.com/?p=218
文章版权归作者所有,未经允许请勿转载。
链接:https://www.52stu.com/?p=218
文章版权归作者所有,未经允许请勿转载。
THE END