华为OD机试的题库年年换新,但有些题型的套路非常稳定。2025年C卷里这道"魔法积木消消乐",用Java和Go都能解,网上能搜到的讨论也不少,但相当一部分题解给的思路是"单调栈扫一遍",看着轻巧,实际一跑复杂样例就翻车。我这次把题目还原、把错误思路为什么错讲透、把Java和Go两版完整实现都写出来,再附上我实测过的多组用例,给正在备战的读者一份能直接照着用的参考答案。
先说清楚,真题的原始题面我记不全,下面这份描述是结合多个渠道还原出来的版本,华为OD机试不同批次在细节上可能略有出入,但核心规则差异不大。另外一点必须提前讲:双机位C卷的考试环境和自己平时在IDE里刷题完全是两回事,代码怎么组织、时间怎么分配、输入输出怎么写,这些细节我会放到最后专门说,别小看这些,很多人的编译分就丢在这上面。
1. 题目还原与核心规则拆解
1.1 题面与输入输出约定
题目大概是这样的:有一排魔法积木,每块积木上印着一个数字(0到9),表示积木的颜色。输入是一串数字字符,长度N在1到1000之间。游戏规则是:如果存在连续且颜色相同、长度不少于3的积木段,这一段就会被整体消除。消除后,左右两边的积木立刻靠拢拼接;拼接后如果又出现新的连续相同且长度不少于3的积木段,就会继续自动消除,直到整个序列稳定,不再有任何长度大于等于3的连续同色段为止。要求输出最终剩余的积木数量,如果全部消除,输出0。
输入约定是一行字符串,比如"1122233344"。输出是一个整数。题目本身不复杂,但规则里埋着两个容易踩的坑,不先想清楚,后面算法怎么写都是错的。
1.2 两个容易忽略的规则细节
第一个细节是"长度不少于3"到底是消3个还是整段消。拿"1111"举例:按"消除恰好3个"的规则,消掉3个,剩下1个;按"整段消除"的规则,因为4个1连续相同且长度4>=3,整段4个一起消失,最终剩余0。这两种解释在真实机试里都可能出现,取决于题面具体怎么措辞。如果题面写的是"消除任意三个连续相同积木",那思路完全是另一套;如果写的是"连续相同不少于3的积木段自动消除",那就是本文讲的整段消除。我建议拿到题先花30秒确认这个规则,再决定用哪种模型。
第二个细节是消除后的连锁反应。很多第一次做这题的人会以为只要扫一遍找出所有长度>=3的段删掉就完事了,但"112221122211"这种数
