✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)
文章目录
- 1. 题目描述
- 2. 输入描述
- 3. 输出描述
- 4. Java算法源码
- 5. 测试
- 6.解题思路
1. 题目描述
请实现一个计票统计系统。你会收到很多投票,其中有合法的也有不合法的,请统计每个候选人得票的数量以及不合法的票数。
(注:不合法的投票指的是投票的名字不存在n个候选人的名字中!!)
数据范围:每组输入中候选人数量满足 1≤n≤100 ,总票数量满足 1≤n≤100
2. 输入描述
第一行输入候选人的人数n,第二行输入n个候选人的名字(均为大写字母的字符串),第三行输入投票人的人数,第四行输入投票。
3. 输出描述
按照输入的顺序,每行输出候选人的名字和得票数量(以" : "隔开,注:英文冒号左右两边都有一个空格!),最后一行输出不合法的票数,格式为"Invalid : "+不合法的票数。
4. Java算法源码
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
//初始化
int numOfCandidates = in.nextInt();
in.nextLine();//指针移到下一行开头
String[] nameOfCandidates = in.nextLine().split(" ");
int numOfVotes = in.nextInt();
in.nextLine();//指针移到下一行开头
String[] voteFor = in.nextLine().split(" ");
Map<String, Integer> dict = new HashMap<>();
int invalid = 0;
for (int i = 0; i < numOfCandidates; i++) {
dict.put(nameOfCandidates[i], 0);
}
//计数
for (int j = 0; j < numOfVotes; j++) {
if (!dict.containsKey(voteFor[j])) {
invalid++;
} else {
Integer pre = dict.get(voteFor[j]);
dict.put(voteFor[j], pre + 1);
}
}
//输出结果
StringBuilder res = new StringBuilder();
for (String s : nameOfCandidates) {
res.append(s);
res.append(" : ");
res.append(dict.get(s));
res.append("\n");
}
res.append("Invalid : ");
res.append(invalid);
System.out.println(res);
}
}
5. 测试
6.解题思路
- 读取输入,首先读取候选人的人数
numOfCandidates
。 - 使用
in.nextLine()
读取候选人的名字,并将其存储在字符串数组nameOfCandidates
中。 - 读取投票人的人数
numOfVotes
。 - 使用
in.nextLine()
读取投票结果,并将其存储在字符串数组voteFor
中。 - 创建一个
HashMap
对象dict
用于存储候选人的得票数量,其中候选人的名字作为键,初始值为0。 - 初始化不合法的票数
invalid
为0。 - 遍历候选人的名字,将其作为键放入
dict
中,并将值初始化为0。 - 遍历投票结果,对每张票进行判断。
- 如果票的名字不在
dict
的键集合中,即为不合法的票,将invalid
加1。 - 如果票的名字在
dict
的键集合中,将对应的候选人的得票数量加1。
- 如果票的名字不在
- 创建一个
StringBuilder
对象res
用于存储输出结果。 - 遍历候选人的名字,按照输入的顺序输出候选人的名字和得票数量,格式为"候选人名字 : 得票数量",并将每行结果追加到
res
中。 - 将不合法的票数输出到
res
的末尾,格式为"Invalid : 不合法的票数"。 - 将
res
转换为字符串并输出。 - 重复步骤1到步骤12,直到没有更多的输入。