华为OD机试 新系统 题库疯狂收录中刷题点这里专栏导读本专栏收录于《华为OD机试JAVA真题》。刷的越多抽中的概率越大私信哪吒备注华为OD加入华为OD刷题交流群每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景发现新题目随时更新全天CSDN在线答疑。一、题目描述给定一组选票votes[]vote[i]代表第i张选票的内容包含一个字符串 “zhangsan,hanmei”表示推荐zhangsan成为明日之星反对hanmei成为明日之星。赞成或返回使用逗号(,)分割。给定一个数组n表示最后将筛选赞成票最多的n个人如果赞成票相同则反对票越少排序越靠前如果赞成票和反对票都相同则按照姓名字典序升序排序。注意• 1 votes.length 500• 1 votes[i].length 20• vote[i]由小写字母和逗号组成且最多只有一个逗号。• vote[i]中赞成票必选反对票可选。• n的取值范围为[1, 不同姓名的数量]二、输入描述第一行输入为M表示选票的数量其中 1 M 500接下来M行为选票具体内容最后一行输入为N表示最终当选明日之星的人员个数 1 N 不同姓名的数量三、输出描述输出一个字符串返回当选的N个人的姓名顺序排列逗号分割。四、测试用例测试用例11、输入6zhangsan,hanmeizhangsan,lisilisilisiwangwuhanmei22、输出zhangsan,lisi3、说明zhangsan赞成2反对0lisi赞成2反对1hanmei赞成1反对1wangwu赞成1反对0zhangsan 和 lisi 赞成票相同比较反对票zhangsan 反对更少所以更靠前。测试用例21、输入4zhangsan,lisilisi,wangwuwangwu,qianliuqianliu,zhangsan22、输出lisi,qianliu3、说明四个人赞成票都为 1zhangsan反对1lisi反对0wangwu反对1qianliu反对0先按反对票升序得到 lisi、qianliu 更靠前再按字典序lisi 在 qianliu 前面。五、解题思路1、题意分析每张选票格式为“zhangsan,hanmei”表示赞成 zhangsan反对 hanmei“lisi”表示只赞成 lisi没有反对人最后要从所有出现过的人中选出前 N 个排序规则为赞成票多的靠前如果赞成票相同则反对票少的靠前如果赞成票和反对票都相同则名字字典序小的靠前2、统计 排序遍历所有投票统计每个人的赞成票和反对票把所有姓名取出来按题目要求自定义排序取前 N 个输出六、Java算法源码publicclassOdTest{publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);// 读取选票数量 MintmInteger.parseInt(scanner.nextLine().trim());// 使用 HashMap 统计每个人的【赞成票数】和【反对票数】// key姓名// valueint[2]// value[0] - 赞成票数// value[1] - 反对票数MapString,int[]mapnewHashMap();// 逐行读取选票for(inti0;im;i){Stringvotescanner.nextLine().trim();// 赞成票必有反对票可无所以 split 后长度可能为 1 或 2String[]partsvote.split(,);// 处理赞成人StringsupportNameparts[0];map.putIfAbsent(supportName,newint[2]);map.get(supportName)[0];// 处理反对人如果存在if(parts.length2parts[1].length()0){StringopposeNameparts[1];map.putIfAbsent(opposeName,newint[2]);map.get(opposeName)[1];}}// 读取最终需要输出的前 N 个人intnInteger.parseInt(scanner.nextLine().trim());// 将所有候选人姓名取出放入列表中准备排序ListStringnamesnewArrayList(map.keySet());// 排序规则// 1. 赞成票数降序越多越靠前// 2. 反对票数升序越少越靠前// 3. 姓名字典序升序names.sort((a,b)-{int[]cntAmap.get(a);int[]cntBmap.get(b);// 先比较赞成票降序if(cntA[0]!cntB[0]){returncntB[0]-cntA[0];}// 再比较反对票升序if(cntA[1]!cntB[1]){returncntA[1]-cntB[1];}// 最后比较姓名字典序升序returna.compareTo(b);});// 取前 N 个姓名并按要求用逗号拼接输出StringBuildersbnewStringBuilder();for(inti0;in;i){if(i0){sb.append(,);}sb.append(names.get(i));}System.out.print(sb.toString());scanner.close();}}七、效果展示1、输入6a,ba,cbbc,ad,a22、输出b,a3、说明统计结果a赞成2反对2b赞成2反对1c赞成1反对1d赞成1反对0a 和 b 的赞成票都为 2比较反对票b 更少所以 b 在前。下一篇华为OD机试 - 简易内存池 - 逻辑分析Java 新系统 200分本专栏收录于《华为OD机试JAVA真题》。刷的越多抽中的概率越大私信哪吒备注华为OD加入华为OD刷题交流群每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景发现新题目随时更新全天CSDN在线答疑。
华为OD机试 - 明日之星选举(Java 新系统 100分)
发布时间:2026/6/30 17:06:56
华为OD机试 新系统 题库疯狂收录中刷题点这里专栏导读本专栏收录于《华为OD机试JAVA真题》。刷的越多抽中的概率越大私信哪吒备注华为OD加入华为OD刷题交流群每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景发现新题目随时更新全天CSDN在线答疑。一、题目描述给定一组选票votes[]vote[i]代表第i张选票的内容包含一个字符串 “zhangsan,hanmei”表示推荐zhangsan成为明日之星反对hanmei成为明日之星。赞成或返回使用逗号(,)分割。给定一个数组n表示最后将筛选赞成票最多的n个人如果赞成票相同则反对票越少排序越靠前如果赞成票和反对票都相同则按照姓名字典序升序排序。注意• 1 votes.length 500• 1 votes[i].length 20• vote[i]由小写字母和逗号组成且最多只有一个逗号。• vote[i]中赞成票必选反对票可选。• n的取值范围为[1, 不同姓名的数量]二、输入描述第一行输入为M表示选票的数量其中 1 M 500接下来M行为选票具体内容最后一行输入为N表示最终当选明日之星的人员个数 1 N 不同姓名的数量三、输出描述输出一个字符串返回当选的N个人的姓名顺序排列逗号分割。四、测试用例测试用例11、输入6zhangsan,hanmeizhangsan,lisilisilisiwangwuhanmei22、输出zhangsan,lisi3、说明zhangsan赞成2反对0lisi赞成2反对1hanmei赞成1反对1wangwu赞成1反对0zhangsan 和 lisi 赞成票相同比较反对票zhangsan 反对更少所以更靠前。测试用例21、输入4zhangsan,lisilisi,wangwuwangwu,qianliuqianliu,zhangsan22、输出lisi,qianliu3、说明四个人赞成票都为 1zhangsan反对1lisi反对0wangwu反对1qianliu反对0先按反对票升序得到 lisi、qianliu 更靠前再按字典序lisi 在 qianliu 前面。五、解题思路1、题意分析每张选票格式为“zhangsan,hanmei”表示赞成 zhangsan反对 hanmei“lisi”表示只赞成 lisi没有反对人最后要从所有出现过的人中选出前 N 个排序规则为赞成票多的靠前如果赞成票相同则反对票少的靠前如果赞成票和反对票都相同则名字字典序小的靠前2、统计 排序遍历所有投票统计每个人的赞成票和反对票把所有姓名取出来按题目要求自定义排序取前 N 个输出六、Java算法源码publicclassOdTest{publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);// 读取选票数量 MintmInteger.parseInt(scanner.nextLine().trim());// 使用 HashMap 统计每个人的【赞成票数】和【反对票数】// key姓名// valueint[2]// value[0] - 赞成票数// value[1] - 反对票数MapString,int[]mapnewHashMap();// 逐行读取选票for(inti0;im;i){Stringvotescanner.nextLine().trim();// 赞成票必有反对票可无所以 split 后长度可能为 1 或 2String[]partsvote.split(,);// 处理赞成人StringsupportNameparts[0];map.putIfAbsent(supportName,newint[2]);map.get(supportName)[0];// 处理反对人如果存在if(parts.length2parts[1].length()0){StringopposeNameparts[1];map.putIfAbsent(opposeName,newint[2]);map.get(opposeName)[1];}}// 读取最终需要输出的前 N 个人intnInteger.parseInt(scanner.nextLine().trim());// 将所有候选人姓名取出放入列表中准备排序ListStringnamesnewArrayList(map.keySet());// 排序规则// 1. 赞成票数降序越多越靠前// 2. 反对票数升序越少越靠前// 3. 姓名字典序升序names.sort((a,b)-{int[]cntAmap.get(a);int[]cntBmap.get(b);// 先比较赞成票降序if(cntA[0]!cntB[0]){returncntB[0]-cntA[0];}// 再比较反对票升序if(cntA[1]!cntB[1]){returncntA[1]-cntB[1];}// 最后比较姓名字典序升序returna.compareTo(b);});// 取前 N 个姓名并按要求用逗号拼接输出StringBuildersbnewStringBuilder();for(inti0;in;i){if(i0){sb.append(,);}sb.append(names.get(i));}System.out.print(sb.toString());scanner.close();}}七、效果展示1、输入6a,ba,cbbc,ad,a22、输出b,a3、说明统计结果a赞成2反对2b赞成2反对1c赞成1反对1d赞成1反对0a 和 b 的赞成票都为 2比较反对票b 更少所以 b 在前。下一篇华为OD机试 - 简易内存池 - 逻辑分析Java 新系统 200分本专栏收录于《华为OD机试JAVA真题》。刷的越多抽中的概率越大私信哪吒备注华为OD加入华为OD刷题交流群每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景发现新题目随时更新全天CSDN在线答疑。