华为OD技术一面手撕题

150. 逆波兰表达式求值 来自leecode

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

  • 有效的算符为 '+''-''*''/'
  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
  • 答案及所有中间计算结果可以用 32 位 整数表示。

示例 1:

复制代码
输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

示例 2:

复制代码
输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6

示例 3:

复制代码
输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
输出:22
解释:该算式转化为常见的中缀算术表达式为:
  ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22
Go 复制代码
func evalRPN(tokens []string) int {
    myStack := make([]int, 0)

	for _, token := range tokens {
		if num, err := strconv.Atoi(token); err == nil {
			myStack = append(myStack, num)
		} else {
			numi := myStack[len(myStack)-1]
			numj := myStack[len(myStack)-2]
			numItem := 0
			if token == "+" {
				numItem = numi + numj
			} else if token == "-" {
				numItem = numj - numi
			} else if token == "*" {
				numItem = numj * numi
			} else if token == "/" {
				numItem = numj / numi
			}
			myStack = myStack[:len(myStack)-2]
			myStack = append(myStack, numItem)
		}

	}
	return myStack[0]
}

这道题主要还是用到了栈的处理方法

相关推荐
哪 吒3 天前
华为OD机试 - 考古问题 - 回溯、全排列问题(Python/JS/C/C++ 2024 C卷 200分)
javascript·python·华为od
Amor风信子5 天前
华为OD机试真题---计算最接近的数
java·开发语言·数据结构·算法·华为od
哪 吒9 天前
华为OD机试 - 无重复字符的元素长度乘积的最大值(Python/JS/C/C++ 2024 C卷 100分)
javascript·python·华为od
哪 吒10 天前
华为OD机试 - 打印机队列 - 优先队列(Java 2024 E卷 200分)
java·开发语言·华为od·优先队列
DC妙妙屋13 天前
10.31.2024刷华为OD C题型
c语言·开发语言·华为od
TangKenny13 天前
计算堆栈中的剩余数字
java·算法·游戏·华为od·华为
A懿轩A18 天前
HarmonyOS Next API12最新版 端云一体化开发-云函数篇
华为od·华为·华为云·harmonyos·鸿蒙·dev
Chrikk18 天前
华为odC++一面-面经总结
开发语言·c++·华为od
哪 吒24 天前
华为OD机试E卷——2024真题目录
算法·华为od·七日集训