🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员
✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解
💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导
👏 感谢大家的订阅➕ 和 喜欢💗
📎在线评测链接
https://app5938.acapp.acwing.com.cn/contest/2/problem/OD1079
🌍 评测功能需要 ⇒ 订阅专栏 ⇐ 后私信联系清隆解锁~
🍓OJ题目截图

文章目录
- 📎在线评测链接
- 🍓OJ题目截图
- 🍄 LYA的数字游戏
- 问题描述
- 输入格式
- 输出格式
- 样例输入1
- 样例输出1
- 样例输入2
- 样例输出2
- 样例输入3
- 样例输出3
- 数据范围
- 题解
- 参考代码
 
 
🍄 LYA的数字游戏
问题描述
LYA发明了一个有趣的数字游戏。给定一组数字,先找出其中出现次数最多的数字,称为众数。如果有多个众数,就把它们按从小到大的顺序排列,组成一个新的数组。最后,求这个新数组的中位数作为游戏的结果。
中位数的定义如下:把一组数从小到大排列,如果数的个数是奇数,那么中间那个数就是中位数;如果数的个数是偶数,那么中间两个数的平均值就是中位数。
现在,LYA给了你一组数字,请你帮她找出游戏的结果。
输入格式
输入一行,包含若干个用空格分隔的整数,表示给定的数字序列。数字个数不超过 1000 1000 1000,每个数字大于 0 0 0 且小于 1000 1000 1000。
输出格式
输出一个整数,表示新数组的中位数。
样例输入1
10 11 21 19 21 17 21 16 21 18 15
样例输出1
21
样例输入2
2 1 5 4 3 3 9 2 7 4 2 15 4 2 4
样例输出2
3
样例输入3
5 1 5 3 5 2 5 5 7 6 7 3 7 11 7 55 7 9 98 9 17 9 15 9 9 1 39
样例输出3
7
数据范围
- 数字个数不超过 1000 1000 1000。
- 每个数字大于 0 0 0 且小于 1000 1000 1000。
题解
首先,我们需要统计每个数字出现的次数,可以用一个哈希表来实现。然后,找出出现次数最多的数字,即为众数。如果有多个众数,就把它们按从小到大的顺序排列,组成一个新的数组。最后,求这个新数组的中位数即可。
求中位数时,如果数组长度为奇数,直接返回中间那个数;如果数组长度为偶数,返回中间两个数的平均值。
参考代码
- Python
from collections import Counter
nums = list(map(int, input().split()))
cnt = Counter(nums)
max_cnt = max(cnt.values())
modes = sorted(k for k, v in cnt.items() if v == max_cnt)
n = len(modes)
if n % 2 == 1:
    print(modes[n // 2])
else:
    print((modes[n // 2 - 1] + modes[n // 2]) // 2)
- Java
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] input = sc.nextLine().split(" ");
        Map<Integer, Integer> cnt = new HashMap<>();
        for (String s : input) {
            int num = Integer.parseInt(s);
            cnt.put(num, cnt.getOrDefault(num, 0) + 1);
        }
        
        int maxCnt = Collections.max(cnt.values());
        List<Integer> modes = new ArrayList<>();
        for (int num : cnt.keySet()) {
            if (cnt.get(num) == maxCnt) {
                modes.add(num);
            }
        }
        
        Collections.sort(modes);
        int n = modes.size();
        if (n % 2 == 1) {
            System.out.println(modes.get(n / 2));
        } else {
            System.out.println((modes.get(n / 2 - 1) + modes.get(n / 2)) / 2);
        }
    }
}
- Cpp
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
int main() {
    string s;
    getline(cin, s);
    
    unordered_map<int, int> cnt;
    int num = 0;
    for (char c : s) {
        if (c == ' ') {
            cnt[num]++;
            num = 0;
        } else {
            num = num * 10 + (c - '0');
        }
    }
    cnt[num]++;
    
    int maxCnt = 0;
    for (auto p : cnt) {
        maxCnt = max(maxCnt, p.second);
    }
    
    vector<int> modes;
    for (auto p : cnt) {
        if (p.second == maxCnt) {
            modes.push_back(p.first);
        }
    }
    
    sort(modes.begin(), modes.end());
    int n = modes.size();
    if (n % 2 == 1) {
        cout << modes[n / 2] << endl;
    } else {
        cout << (modes[n / 2 - 1] + modes[n / 2]) / 2 << endl;
    }
    
    return 0;
}




![[word] word 如何在文档中进行分栏排版? #媒体#其他#媒体](https://img-blog.csdnimg.cn/img_convert/0f19c736835289ab21d03529b9c2dc2e.jpeg)














