华为OD机试 - 智能广播合并台号 - 数组(Java 新系统 100分)
华为OD机试 新系统 题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
某社区有多条广播线路,每条线路用一个大写英文字母编号表示 (A-Z)。当发送广播时,为减少操作次数,会将连续相邻编号且满足一定个数的线路合并为一个区间,用“起始编号-结束编号”的简写形式表示;不连续或不满足个数的线路则单独列出。合并后的结果要求按字母升序排列,各项之间用一个逗号分隔。
具体合并规则如下:
• 若连续的线路编号个数 ≥ 3 个,则合并为一个区间,格式为 起始-结束(如 B-F 表示 B、C、D、E、F 五条线路)
• 若连续线路编号个数 = 2 个,不合并,仍各自单独列出(如 AB 两个编号写成 A,B)
• 若连续线路编号个数 = 1 个,单独列出(如 G)
• 不连续的线路之间各自处理,互不影响
二、输入描述
参数 1:整数 n,表示需要广播的线路条数
参数 2:n 个大写字母,空格分隔,表示发送广播的线路编号。字母可能重复,但合并时每个编号只计一次。
三、输出描述
一个字符串 Q,表示合并后的广播线路列表,按字母升序排列,项间用逗号分隔。
约束:1 ≤ n ≤ 26,字母范围为 A-Z(仅大写)。输入字母可能有重复,需去重后排序再合并。
四、测试用例
测试用例1:
1、输入
6
G B A F D C
2、输出
A-D,F,G
测试用例2:
1、输入
3
A C B
2、输出
A-C
五、解题思路
六、Java算法源码
publicclassOdTest{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);intn=scanner.nextInt();/* * 由于线路编号只可能是 A-Z,共 26 个, * 使用布尔数组即可同时完成: * * 1. 去重 * 2. 记录某个线路是否出现 * * exist[0] 表示 A 是否出现 * exist[1] 表示 B 是否出现 * ... * exist[25] 表示 Z 是否出现 */boolean[]exist=newboolean[26];for(inti=0;i<n;i++){charch=scanner.next().charAt(0);/* * 例如: * A - A = 0 * B - A = 1 * D - A = 3 * * 如果存在重复字母,只会重复把同一个位置设置成 true, * 因此自然完成去重。 */exist[ch-'A']=true;}// 保存最终的每一个输出项,例如 A-D、F、G。List<String>result=newArrayList<>();inti=0;while(i<26){/* * 当前字母没有出现,则直接跳过, * 继续寻找下一段连续线路的起点。 */if(!exist[i]){i++;continue;}// 当前位置就是一段连续区间的起点。intstart=i;/* * 不断检查后一个字母是否存在, * 找出当前连续线路区间的终点。 * * 例如: * A B C D 都存在 * * start = A * end = D */while(i+1<26&&exist[i+1]){i++;}intend=i;// 当前连续区间包含的字母个数。intlen=end-start+1;if(len>=3){/* * 连续线路不少于 3 个时进行压缩。 * * 例如: * A B C D * * 输出: * A-D */result.add(""+(char)('A'+start)+"-"+(char)('A'+end));}else{/* * 连续线路只有 1 个或者 2 个时, * 根据题目要求不能使用区间形式, * 必须逐个输出。 * * 例如: * A B * * 输出: * A,B */for(intj=start;j<=end;j++){result.add(String.valueOf((char)('A'+j)));}}/* * 当前连续区间已经全部处理完成。 * i 当前位于区间终点, * 移动到下一个位置继续扫描。 */i++;}// 使用逗号连接所有结果项,不会产生多余逗号。System.out.println(String.join(",",result));scanner.close();}}七、效果展示
1、输入
7
A B D E F H H
2、输出
A,B,D-F,H
3、说明
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 新系统 200分)
🏆本专栏收录于《华为OD机试(JAVA)真题》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。