华为OD机试 新系统 统一考试题库清单(持续收录中)以及考点说明(Python/JS/C/C++)。
专栏导读
本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。
一、题目描述
在一个充满魔法能量的消除游戏中,一排排不同颜色的能量球(代表不同质量/能量值)静止在网格中。当玩家触发消除机制时,相邻的
能量球会发生相互碰撞。
消除规则:
碰撞机制:当两个相邻的能量球相遇时,系统会根据它们的能量值(质量)进行判断。
强弱判定:如果两个能量球的能量值不同,能量值较低的那个球会被对手的能量波吞噬,从而消除。
同归于尽:如果两个能量球的能量值完全相同,它们会引发剧烈的能量湮灭反应,导致两者同时被消除。
幸存条件:只有能量值足够高且未发生碰撞(或碰撞后存活)的能量球,才能留在场上继续等待下一轮消除。
题目目标:
给定一排初始的能量球序列,请模拟上述消除过程,找出最终留在场上的所有能量球及其顺序。
约束:
能量球的个数不超过 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:新球被消除,原幸存球继续存在。
为什么只保存一个变量就够?
因为每次新球与当前幸存球碰撞后,结果只可能是:
- 留下其中一个;
- 两个都消失。
因此任意时刻场上最多只有一个有效幸存球,没有必要使用栈、队列或数组保存中间状态。
六、Python算法源码
importsysdefmain():lines=sys.stdin.read().splitlines()n=int(lines[0].strip())line=lines[1].strip()iflen(lines)>1else""has_survivor=Falsesurvivor=0ifn>0andline:nums=line.split(",")foriinrange(n):current=int(nums[i].strip())ifnothas_survivor:# 当前没有幸存球,# 新球直接成为当前幸存球。survivor=current has_survivor=Trueelifcurrent==survivor:# 两个能量球数值相同,# 两者同时消除,场上重新为空。has_survivor=Falseelifcurrent>survivor:# 新球能量更高,# 原幸存球被消除,新球成为新的幸存球。survivor=current# current < survivor 时:# 新球被原幸存球消除,因此不需要修改 survivor。ifhas_survivor:print(survivor)else:print("")if__name__=="__main__":main()七、JavaScript算法源码
constfs=require('fs');constinput=fs.readFileSync(0,'utf8').split(/\r?\n/);constn=Number((input[0]||'').trim());constline=(input[1]||'').trim();lethasSurvivor=false;letsurvivor=0;if(n>0&&line.length>0){constnums=line.split(',');for(leti=0;i<n;i++){constcurrent=Number(nums[i].trim());if(!hasSurvivor){// 当前没有幸存球,// 新进入的球直接成为当前幸存球。survivor=current;hasSurvivor=true;}elseif(current===survivor){// 能量值完全相同,// 两个球同时消除。hasSurvivor=false;}elseif(current>survivor){// 新球能量更高,// 原幸存球被消除,新球成为幸存球。survivor=current;}// current < survivor 时:// 新球被消除,原 survivor 不变。}}console.log(hasSurvivor?survivor:'');八、C算法源码
#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(void){intn;if(scanf("%d",&n)!=1){return0;}/* * 清理读取 n 之后直到当前行末尾的字符, * 防止下面的 fgets 直接读到残留的换行符。 */intch;while((ch=getchar())!='\n'&&ch!=EOF){}/* * n 最大为 1000,每个数最大 10000, * 加上逗号后 12000 字符空间已经足够。 */charline[12000];if(fgets(line,sizeof(line),stdin)==NULL){line[0]='\0';}inthasSurvivor=0;intsurvivor=0;/* * strtok 按照逗号切分输入数据。 * 同时把 \\r 和 \\n 作为分隔符, * 兼容不同系统的换行格式。 */char*token=strtok(line,",\r\n");for(inti=0;i<n&&token!=NULL;i++){intcurrent=atoi(token);if(!hasSurvivor){// 当前没有幸存球,新球直接留下。survivor=current;hasSurvivor=1;}elseif(current==survivor){// 两球能量相同,同归于尽。hasSurvivor=0;}elseif(current>survivor){// 新球更强,消除原幸存球,// 新球成为新的幸存球。survivor=current;}/* * current < survivor 时, * 新球被消除,因此 survivor 保持不变。 */token=strtok(NULL,",\r\n");}if(hasSurvivor){printf("%d\n",survivor);}else{printf("\n");}return0;}九、C++算法源码
#include<iostream>#include<sstream>#include<string>#include<limits>usingnamespacestd;intmain(){intn;cin>>n;// 清除读取 n 后剩余的换行内容,// 防止 getline 直接读到一个空字符串。cin.ignore(numeric_limits<streamsize>::max(),'\n');string line;getline(cin,line);stringstreamss(line);boolhasSurvivor=false;intsurvivor=0;for(inti=0;i<n;i++){string token;// 每次读取一个以逗号分隔的能量值。getline(ss,token,',');intcurrent=stoi(token);if(!hasSurvivor){// 当前没有幸存球,// 新球直接成为当前幸存球。survivor=current;hasSurvivor=true;}elseif(current==survivor){// 能量相同,两球同时消除。hasSurvivor=false;}elseif(current>survivor){// 新球更强,// 原幸存球被消除,新球成为新的幸存球。survivor=current;}// current < survivor 时,// 新球被消除,原 survivor 不发生变化。}if(hasSurvivor){cout<<survivor<<'\n';}else{cout<<'\n';}return0;}🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 新系统 200分)
🏆本文收录于,华为OD机试真题(Python/JS/C/C++)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。