目录

题目

思路

Code

题目

题目内容:

在一个消除游戏中,一排不同能量值的能量球静止在网格中。当触发消除机制时,相邻能量球会发生碰撞。

如果两个能量球能量值不同,能量值较低的球会被能量值较高的球吞噬并消除。

如果两个能量球能量值完全相同,它们会同归于尽并同时消除。

给定初始能量球序列,请模拟消除过程,找出最终留在场上的能量球序列。

约束:能量球个数不超过 1000,能量值为非负整数且不超过 10000。

输入描述:

第一行输入整数 n,表示能量球数量。

第二行输入 n 个能量值,用英文逗号分隔。

输出描述:

输出最终留在场上的能量球序列,用英文逗号分隔;如果没有能量球留存,则输出空内容。

样例 1

输入:

5
3,5,5,2,3

输出:

3

说明:

3 被 5 吞噬,两个 5 同归于尽;随后 2 被 3 吞噬,最终剩下 3。

样例 2

输入:

6
1,2,2,1,3,4

输出:

4

说明:

1 被 2 吞噬,两个 2 同归于尽;后续 1 被 3 吞噬,3 又被 4 吞噬,最终剩下 4。

思路

整体思路:题目规则会让当前幸存能量球与后续能量球持续碰撞,因此只需要维护当前幸存值。

第一步:如果当前没有幸存球,则把新能量球作为幸存球。

第二步:如果新能量球更强,则原幸存球被吞噬,新能量球成为幸存球。

第三步:如果新能量球和幸存球相等,则两者同归于尽,幸存状态清空。

第四步:如果新能量球更弱,则会被当前幸存球吞噬,幸存状态不变。

边界处理:能量值允许为 0,所以不能用 -1 以外的有效值混淆;实现中使用空状态表示没有幸存球。

复杂度分析:只扫描一遍能量数组,时间复杂度 O(n),额外空间 O(1)。

思路配图

Code

import sys

lines = [line.strip() for line in sys.stdin if line.strip()]
n = int(lines[0])
energy = list(map(int, lines[1].split(","))) if n else []
survive = None
for cur in energy:
    if survive is None or cur > survive:
        # 当前场上没有球,或新球能量更高时,它会成为后续碰撞的唯一幸存候选。
        survive = cur
    elif cur == survive:
        # 能量相同对应题目的“同归于尽”,候选球和当前球都被消除。
        survive = None
    else:
        # 当前球更弱时直接被候选球吞噬,场上状态不需要变化。
        pass
# None 表示最终没有球留存,按题意输出空字符串而不是 0 或占位符。
print("" if survive is None else str(survive))

JS

const fs = require("fs");
const lines = fs.readFileSync(0, "utf8").trim().split(/\n/).map(s => s.trim());
const n = Number(lines[0]);
const energy = lines[1].split(",").map(Number);
let hasSurvive = false;
let survive = 0;
for (let i = 0; i < n; i++) {
  const cur = energy[i];
  if (!hasSurvive || cur > survive) {
    // hasSurvive 表示场上是否有候选球;空场或更强新球都会刷新候选。
    survive = cur;
    hasSurvive = true;
  } else if (cur === survive) {
    // 能量相同对应同归于尽,候选球和当前球一起消失。
    hasSurvive = false;
  } else {
    // 当前球更弱时被候选球吞噬,不会改变后续碰撞对象。
  }
}
// 没有候选球留下时,最终留存序列为空,不能输出数字占位。
process.stdout.write(hasSurvive ? String(survive) : "");

【华为od机试真题Python+JS+Java+Go合集】【超值优惠】:Py/JS/Java/Go合集

【华为od机试真题Python】:Python真题题库

【华为od机试真题JavaScript】:JavaScript真题题库

【华为od机试真题Java&Go】:Java&Go真题题库

【华为od机试真题C++】:C++真题题库

【华为od机试真题C语言】:C语言真题题库

【华为od面试手撕代码题库】:面试手撕代码题库

【华为od机试面试交流群】【文章底部有二维码链接,可扫码加交流群】

华为OD机试面试交流群二维码

华为OD机试:二本院校有机会吗? 有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。

更多推荐