7-58 求整数序列中出现次数最多的数(15 分)

该博客介绍了如何在C语言中解决PTA平台上的一个问题:给定一个整数序列,找出并输出出现次数最多的整数及其频率。程序需要处理包含1到1000个整数的序列,并确保输出的数字是唯一出现次数最多的。

7-58 求整数序列中出现次数最多的数(15 分)

本题要求统计一个整型序列中出现次数最多的整数及其出现次数。

输入格式:

输入在一行中给出序列中整数个数N(0<N

请用JAVA语言ACM模式进行编程(逐行注释),并给出解题思路【题目描述 一个有N个选手参加比赛,选手编号为1-N(3≤N≤100),有M(3sM=10)个评委对选手进行打,打规则为每个评委对选手打,最高10,最低1。请计算得最多的3位选手的编号。如果得相同,则得最多的选手排名靠前(10量相同,则比较9量,以此类推,用例中不会出现多个选手得完全相同的情况)输入描述 第一行为半角逗号割的两个正整数,第一个数字表示M(3sM≤10)个评委,第二个数字表示N(3≤N≤100)个选手。第2到M+1行是半角逗号割的整数序列,表示评委为每个选手的打0号下标数字表示1号选手,1号下标数字表示2号选手,依次类推。输出描述选手前3名的编号。注:输入为异常,输出-1,如M、N、打不在范围内。 示例1输入4,5 10.6 9.7.69,10.6,7,58 10.6 510 9.10.8 4.9输出2,1,5说明 第一行代表有4个评委,5个选手参加比赛矩阵代表是4*5,每个数字是选手的编号,每一行代表个评委对选手的打排序,2号选手得36排第1,1号选手36排第2,5号选手30(2号10值有3个,1号10值只有1个,所以2号排第一) 示例2输入2,5 7.3,5,4,28,5,4,4,3输出 -1 说明 只有2个评委,要最少为3个评委示例3输入4,28,5 5.610,48,9输出 -1 说明 只有2名选手参加,要最少为3名示例4输入4,5 11,6,9,7,89,10,6,7,88,10,6,9,79,10,8,6,7输出 -1 说明 第一个评委给第一个选手打11,无效
最新发布
06-15
以下是使用Java语言实现的ACM模式程序,逐行注释清晰地解释了代码逻辑,并给出了解题思路。 ### 解题思路 1. **输入验证**:检查评委量M是否满足3≤M≤10,选手量N是否满足3≤N≤100。 2. **解析**:读取每个评委对选手的打,并验证是否在1到10。 3. **统计**: - 统计每个选手的总- 记录每个选手获得的各(10、9、8等)的量。 4. **排序规则**: - 首先按总从高到低排序。 - 如果总相同,则按10量从多到少排序;如果10量相同,则按9量排序,依此类推。 5. **输出结果**:输出得最多的前3名选手编号。如果输入异常,输出-1。 以下是完整的代码实现: ```java import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 读取第一行,获取评委量M和选手量N String[] firstLine = scanner.nextLine().split(","); int M = Integer.parseInt(firstLine[0].trim()); int N = Integer.parseInt(firstLine[1].trim()); // 检查M和N是否符合范围 if (M < 3 || M > 10 || N < 3 || N > 100) { System.out.println(-1); return; } // 创建一个二维组用于存储每个选手的评情况 // 第一维表示选手编号,第二维表示该选手获得的10到1量 int[][] scoreCount = new int[N][11]; // scoreCount[i][j] 表示第i个选手获得j次数 // 遍历接下来的M行,读取每个评委的评 for (int i = 0; i < M; i++) { String[] scores = scanner.nextLine().split(","); if (scores.length != N) { // 检查评量是否与选手量一致 System.out.println(-1); return; } for (int j = 0; j < N; j++) { int score = Integer.parseInt(scores[j].trim()); if (score < 1 || score > 10) { // 检查评是否在有效范围内 System.out.println(-1); return; } scoreCount[j][score]++; // 更新该选手获得对应次数 scoreCount[j][0] += score; // 更新该选手的总(scoreCount[j][0]表示总) } } // 将选手信息存入List以便排序 List<Competitor> competitors = new ArrayList<>(); for (int i = 0; i < N; i++) { competitors.add(new Competitor(i + 1, scoreCount[i])); } // 按照题目要进行排序 Collections.sort(competitors, new Comparator<Competitor>() { @Override public int compare(Competitor c1, Competitor c2) { // 首先比较总 if (c1.totalScore != c2.totalScore) { return c2.totalScore - c1.totalScore; } // 如果总相同,则依次比较10、9、8...的量 for (int i = 10; i >= 1; i--) { if (c1.scoreCounts[i] != c2.scoreCounts[i]) { return c2.scoreCounts[i] - c1.scoreCounts[i]; } } return 0; // 不会出现完全相同的选手 } }); // 输出前3名选手的编号 StringBuilder result = new StringBuilder(); for (int i = 0; i < 3; i++) { result.append(competitors.get(i).id).append(","); } System.out.println(result.substring(0, result.length() - 1)); // 去掉最后一个逗号 } // 定义一个类表示选手 static class Competitor { int id; // 选手编号 int totalScore; // 总 int[] scoreCounts; // 各量 public Competitor(int id, int[] scoreCounts) { this.id = id; this.scoreCounts = scoreCounts; this.totalScore = scoreCounts[0]; // 总存储在scoreCounts[0] } } } ``` ### 代码解释 1. **输入处理**: - 使用`Scanner`读取输入据。 - 验证M和N是否在有效范围内(3≤M≤10,3≤N≤100)。 - 检查每行评量是否与选手量一致,且每个评是否在1到10。 2. **统计**: - 使用二维组`scoreCount`记录每个选手获得的各量。 - `scoreCount[i][0]`表示第i个选手的总,`scoreCount[i][j]`表示第i个选手获得j次数。 3. **排序规则**: - 使用自定义比较器`Comparator`实现排序规则。 - 首先按总排序,如果总相同,则依次比较10、9、8...的量。 4. **输出结果**: - 输出前3名选手的编号,用逗号隔。 ### 示例运行 #### 输入 ``` 4,5 10,6,9,7,6 9,10,6,7,5 8,10,6,5,4 9,10,8,4,9 ``` #### 输出 ``` 2,1,5 ``` #### 输入 ``` 2,5 7,3,5,4,2 8,5,4,4,3 ``` #### 输出 ``` -1 ``` --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值