华为OD机试 - 消消乐能量碰撞(Java 新系统 100分)
华为OD机试 新系统 题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
在一个充满魔法能量的消除游戏中,一排排不同颜色的能量球(代表不同质量/能量值)静止在网格中。当玩家触发消除机制时,相邻的
能量球会发生相互碰撞。
消除规则:
碰撞机制:当两个相邻的能量球相遇时,系统会根据它们的能量值(质量)进行判断。
强弱判定:如果两个能量球的能量值不同,能量值较低的那个球会被对手的能量波吞噬,从而消除。
同归于尽:如果两个能量球的能量值完全相同,它们会引发剧烈的能量湮灭反应,导致两者同时被消除。
幸存条件:只有能量值足够高且未发生碰撞(或碰撞后存活)的能量球,才能留在场上继续等待下一轮消除。
题目目标:
给定一排初始的能量球序列,请模拟上述消除过程,找出最终留在场上的所有能量球及其顺序。
约束:
能量球的个数不超过 1000 个,能量球的能量值是非负整数,最大不超过 10000
二、输入描述
输入为一行字符串,格式为
n a1,a2,a3,...,an其中 n 表示能量球的数量,方括号内为初始能量球序列的数值列表。
三、输出描述
输出最终留在场上的所有能量球序列,以数组形式表示,格式为 b1,b2,…,bm。
四、测试用例
测试用例1:
1、输入
5
3,5,5,2,3
2、输出
3
3、说明
3 留下
5 > 3,留下 5
5 == 5,两个都消除
2 留下
3 > 2,最终留下 3
测试用例2:
1、输入
6
1,2,2,1,3,4
2、输出
4
3、说明
1
2 > 1 → 2
2 == 2 → 全部消失
1
3 > 1 → 3
4 > 3 → 4
最终输出 4。
五、解题思路
处理每个新能量球 current 时,只需要关心当前场上是否存在一个幸存球 survivor:
当前没有幸存球:current 直接留下。
- current == survivor:两个球同时消除,场上为空。
- current > survivor:原幸存球被消除,current 成为新幸存球。
- current < survivor:新球被消除,原幸存球继续存在。
为什么只保存一个变量就够?
因为每次新球与当前幸存球碰撞后,结果只可能是:
- 留下其中一个;
- 两个都消失。
因此任意时刻场上最多只有一个有效幸存球,没有必要使用栈、队列或数组保存中间状态。
六、Java算法源码
publicclassOdTest{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);// 输入既包含换行,也包含逗号,因此把“逗号或任意空白字符”都作为分隔符。// 例如:// 5// 3,5,5,2,3// 会依次读取出 5、3、5、5、2、3。scanner.useDelimiter("[,\\s]+");intn=scanner.nextInt();// hasSurvivor 表示当前场上是否存在幸存球。booleanhasSurvivor=false;// survivor 保存当前幸存球的能量值。intsurvivor=0;for(inti=0;i<n;i++){intcurrent=scanner.nextInt();if(!hasSurvivor){// 当前场上没有能量球,// 新进入的能量球直接成为当前幸存球。survivor=current;hasSurvivor=true;}elseif(current==survivor){// 两个相邻能量球能量完全相同,// 根据规则两者同归于尽,因此场上重新变为空。hasSurvivor=false;}elseif(current>survivor){// 新进入的能量球更强,// 原幸存球被消除,新球成为新的幸存球。survivor=current;}// 如果 current < survivor:// 新进入的球较弱,会被原幸存球消除。// survivor 不需要发生任何变化。}// 根据题目给出的样例格式,输出时不添加 []。// 如果全部能量球都被消除,则输出空行。if(hasSurvivor){System.out.println(survivor);}else{System.out.println();}scanner.close();}}七、效果展示
1、输入
5
0,3,3,0,2
2、输出
2
3、说明
0 留下
3 > 0 → 留下 3
3 == 3 → 两个都消失
0 留下
2 > 0 → 留下 2
最终输出 2。
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 新系统 200分)
🏆本专栏收录于《华为OD机试(JAVA)真题》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
