LCP 17「速算机器人」题解:A/B 双变量迭代的模拟实现与多语言对照(doocs/leetcode)
示例工程【免费下载链接】leetcodeLeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer第 2 版》、《程序员面试金典第 6 版》题解项目地址https://gitcode.com/doocs/leetcode点击查看免费下载本文基于 doocs/leetcode 开源题解仓库中 LCP 17. 速算机器人 的题目文档结合仓库内 Python3、Java、C、Go、Swift 五种语言的 Solution 源码完整讲解这道双变量模拟题的运算规则、逐步推演、复杂度分析与可复制的多语言实现并补充从运算定义直接推导出的数学性质作为扩展视角。题目背景与核心规则小扣在秋日市集发现了一款速算机器人。店家对机器人说出两个数字记作x和y请小扣说出计算指令。指令只包含两种运算均由大写字母表示A运算使x 2 * x yB运算使y 2 * y x。在本次游戏中店家说出的初始数字固定为x 1、y 0小扣说出的计算指令记作仅由大写字母A、B组成的字符串s字符串中字符的顺序即计算顺序。题目要求返回最终x与y的和。题目约束如下来自原文档「提示」0 s.length 10s由A和B组成。由于指令长度不超过 10状态空间极小任何复杂算法都无必要——这为下面的直接模拟解法奠定了前提。示例推演以s AB为例原文档给出的示例完整演示了两步运算的过程初始状态x 1, y 0经过一次A运算x 2 * 1 0 2此时x 2, y 0再经过一次B运算y 2 * 0 2 2此时x 2, y 2最终x与y之和为2 2 4即输入s AB输出4。需要注意的是两次运算之间是顺序依赖的B运算中y 2 * y x使用的x是上一步A运算更新后的值而不是初始值。这正是模拟题与公式题的关键区别也是实现时必须严格按字符顺序更新变量、且先更新目标变量再读取对方变量的原因。思路分析按指令顺序直接模拟原文档「思考」部分给出的核心思路非常明确指令长度不超过 10按A、B的定义从x 1、y 0依次更新即可。无需寻找通项或回溯。遍历s遇A则x ← 2x y遇B则y ← 2y x最后返回x y。该策略对应的时间复杂度为O(n)n为指令串长度空间复杂度为O(1)仅使用两个整型变量与一个循环计数器。由于n ≤ 10即使是嵌套回溯或枚举也不可能比这个线性模拟更快或更有必要。关键实现细节初始值固定x 1, y 0是题目给定的游戏初始条件不是从输入解析出来的分支判断遇A更新x否则即B更新y。由于s仅由A、B组成else分支等价于B分支更新顺序A运算只修改x公式中使用的y为当前值B运算只修改y公式中使用的x为当前值。两条更新互不覆盖对方变量因此无需引入临时变量返回值循环结束后返回x y。多语言实现与源码对照原文档提供了 Python3、Java、C、Go、Swift 五种语言的完整实现仓库中每个语言均有对应的独立 Solution 源文件两者代码一致。下面逐一列出并给出仓库内源码相对路径供深入查阅。Python3对应源码Solution.pyclass Solution: def calculate(self, s: str) - int: x, y 1, 0 for c in s: if c A: x x * 2 y else: y y * 2 x return x yJava对应源码Solution.javaclass Solution { public int calculate(String s) { int x 1, y 0; for (char c : s.toCharArray()) { if (c A) { x x * 2 y; } else { y y * 2 x; } } return x y; } }C对应源码Solution.cppclass Solution { public: int calculate(string s) { int x 1, y 0; for (char c : s) { if (c A) x x * 2 y; else y y * 2 x; } return x y; } };Go对应源码Solution.gofunc calculate(s string) int { x, y : 1, 0 for _, c : range s { if c A { x x*2 y } else { y y*2 x } } return x y }Swift对应源码Solution.swiftclass Solution { func calculate(_ s: String) - Int { var x 1 var y 0 for c in s { if c A { x x * 2 y } else if c B { y y * 2 x } } return x y } }语言特性差异说明Python3 / Gofor c in s/for _, c : range s直接遍历字符Go 中x x*2 y也可以简写为x x1 y位运算版本但可读性以乘 2 写法为佳Java通过s.toCharArray()将字符串转为字符数组后遍历C使用char引用遍历避免拷贝字符Swift显式用if c A与else if c B双分支判断逻辑最清晰与其余语言的if/else单分支在结果上完全等价因为输入只含A、B。从源码结构看五种实现均严格遵循「遇 A 更新 x、遇 B 更新 y、最后返回 x y」的统一骨架只是语法层面有差异便于读者按自己熟悉的语言对照学习。边界情况与易错点空字符串s 循环体一次都不执行直接返回x y 1 0 1。这符合题意没有任何指令返回初始和全A或全B指令例如s AAA时只有x被更新y恒为0最终返回更新后的x值反之s BBB时只有y被更新x恒为1变量更新依赖顺序B运算必须使用当前可能已被前面A更新过的x值若先暂存初始值再统一更新结果会错误数值范围指令长度n ≤ 10每一步总和翻倍见下节最大值不超过2^10 1024int/Int类型完全足够无需担心溢出。扩展视角一个从运算定义可直接推导的性质原文档明确指出「无需寻找通项或回溯」直接模拟已是最优解。但作为延伸可以从运算定义出发验证一个有趣的数学性质帮助读者加深对题目的理解A运算后新x y (2x y) y 2x 2y 2(x y)B运算后新x y x (2y x) 2x 2y 2(x y)。也就是说无论执行A还是Bx与y的总和每一步都会翻倍。初始x y 1因此执行n条指令后的答案恒等于2^n。这与示例s ABn 2答案为4 2^2完全吻合也与上文的直接模拟结果一致。该性质可作为编写单元测试时的快速验证手段但正式解法仍以线性模拟为准因为二者时间复杂度同为O(n)模拟法更贴近题目本意且不易出错。小结LCP 17「速算机器人」是一道典型的状态模拟题给定固定初始值x 1, y 0与仅含A、B的指令串按序执行x 2x y或y 2y x后返回x y。核心要点在于严格按顺序更新、正确读取对方的当前值时间复杂度O(n)、空间复杂度O(1)。doocs/leetcode 仓库在 lcp/LCP 17. 速算机器人 目录下同时维护了题解文档README.md与五种语言的独立源码文件可直接作为刷题与面试复习的对照参考而「每步总和翻倍」这一由定义推导出的性质则为验证结果提供了额外的数学捷径。赞分享示例工程【免费下载链接】leetcodeLeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer第 2 版》、《程序员面试金典第 6 版》题解项目地址https://gitcode.com/doocs/leetcode点击查看免费下载相关推荐面试题 16.18 模式匹配深度解析枚举长度 切片校验的双变量解法doocs/leetcode 多语言实现面试题 16.18 模式匹配深度解析枚举长度 切片校验的双变量解法doocs/leetcode 多语言实现 本篇围绕《程序员面试金典第 6 版》第示例工程doocs/leetcode 题解精讲面试题 01.08 零矩阵Zero Matrix双解法与多语言实现doocs/leetcode 题解精讲面试题 01.08 零矩阵Zero Matrix双解法与多语言实现 本文以 doocs/leetcode 仓库中 l示例工程Roc 语言多类型变量注解深入解析从 swap : (a, b) - (b, a) 看编译器快照测试管线Roc 语言多类型变量注解深入解析从 swap : a, b b, a 看编译器快照测试管线 Roc 是一个快速、友好、函数式的编程语言。本文以编译器快照测试上一篇使用 pixi-skills用 Pixi 包管理器统一管理跨 LLM 后端的编码 Agent 技能下一篇FTS5全文检索AI语义重排Siftly双引擎搜索架构深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考