通过率 52% · 提交 865 · 通过 449
小慕正在设计一个自定义表达式计算器,其中唯一的语法规则是括号必须正确配对。表达式的格式为 ( P1 P2 …),括号内各元素之间用单个空格分隔。第一个元素 OP 是操作符,后面的元素都是它的参数,参数个数由操作符类型决定。 注意:参数 P1 和 P2 本身也可能是另一个的 (OP P1 P2 …) 表达式。当前支持的操作符类型有 add / sub / mul / div(全小写),分别表示整数的加、减、乘、除。为简化问题,所有操作符的参数个数均为 2。 举例: - 输入:(mul 3 - 7) 输出: -21 - 输入:(add 1 2) 输出:3 - 输入:(sub(mul 2 4) (div 9 3)) 输出:5 - 输入:(div 1 0) 输出:error 题目中涉及的所有数字均为整数,可能为负;不考虑 32 位整数的溢出翻转,计算过程中也不会发生 32 位溢出翻转。当出现除零错误时,输出 "error"。除法遇到除不尽的情况,,例如 3 / 2 = 1。
这类题属于华为 OD 机考真题方向中「200分 / 2024E」方向的高频题型,通常考察对「200分 / 2024E」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
输入为长度不超过 512 的字符串,用例保证了无语法错误
输出计算结果或者"error"
示例 1
输入示例
(div 12 (sub 45 45))
输出示例
error
示例 2
输入示例
(add 1 (div -7 3))
输出示例
-2
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
这道题也是经典的括号配对兼表达式求值的栈题,所给的字符串是一个前缀表达式。和 逆波兰表达式求值 有一定的相似之处。
本题的难点主要在于对原字符串的处理,如何把字符串 s = "(sub (mul 2 4) (div 9 3))",储存为方便栈运算的列表形式 ops = ['(', 'sub', '(', 'mul', '2', '4', ')', '(', 'div', '9', '3', ')', ')']。
对于这个问题,这里提出两种可能的处理方式。
replace() 和 split()使用字符串的 replace() 方法,将 s 中所有的左括号 "(" 和右括号 ")" 前后都加上空格,即替换为 " ( " 和 " ) ",然后再对替换后的字符串 s 使用 split() 方法。代码为:
while 循环遍历用 while 循环遍历原字符串 s,初始化索引 i = 0。如果 ch = s[i] 为:
ch 添加到列表最后一个元素的尾部 ops[-1] 即可,即一个数字进行延申操作。同时索引 i += 1。ch 加入 ops 列表尾部,同时索引 i += 3。ch 加入 ops 列表尾部,同时索引 i += 1。"" 加入 ops 列表尾部,用于记录接下来可能出现的数字,同时索引 i += 1。上述逻辑整理为代码即:
由于第二种方法更加具备通用性,在后面给出的题解代码中将使用第二种方法来处理原始字符串。
在获得了 ops 列表之后,剩下的部分就是常规的栈操作了。
首先需要构建一个空栈 stack,然后遍历 ops 中的所有符号 ch。当 ch 为:
ch 入栈。int(ch) 入栈。num1 和 num2,然后再次弹出栈顶元素得到用字母表示的操作符 op,然后再一次弹出栈顶元素,把该右括号对应的左括号 "(" 出栈。op 的取值,对 num1 和 num2 进行加减乘除的操作,并且需要把计算的结果 res 再次存入栈中。上述逻辑整理为代码即:
复杂度分析 设输入表达式的长度为 n。算法分两个线性阶段。第一阶段把原字符串整理成记号列表 ops:while 循环中每个字符只被访问一次,遇到操作符字母时记录首字母并用 i += 3 一次跳过剩余字母,数字与负号逐字符拼接到当前记号尾部,括号与空格各产生一个记号;整理加上随后过滤空串的列表推导,总计 O(n)。第二阶段对 ops 做栈求值:每个记号至多入栈一次,遇到右括号时弹出两个操作数、一个操作符和一个左括号,做一次加减乘除并把结果压回栈中。由于每个元素只会被压入、弹出各一次,这一阶段的总代价也是 O(n)。因此整体时间复杂度为 O(n),开销就是两次线性扫描,没有更高阶的瓶颈;出现除零时置 isError 并提前退出,只会更快。空间复杂度 O(n):ops 列表与求值栈的长度都不超过记号总数,而记号总数与输入长度同阶。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有