【LeetCode】227、基本计算器 II

【LeetCode】227、基本计算器 II

文章目录

一、栈

1.1 栈

go 复制代码
// go
func calculate(s string) int {
	// 需要解析字符串 里的每个 token
	// 本题不涉及括号, 只有+-*/, 所以涉及优先级: */的优先级比+-高
	// 为了处理优先级, 需要用栈: 即先遇到的+-都依次放入栈, 当遇到*/时优先一次性计算完, 再入栈
	// 最终栈内只有+-两种符号, 不存在优先级的问题, 则把栈内元素依次+-即可

	// 因为计算, 都是 "数" "符号" "数" 计算, 如 1 + 2, 3 / 5, 所以用两个栈: 数字栈和符号栈存储

	// 示例1:
	// 数字栈 [],  符号栈 []
	// 数字栈 [3], 符号栈 [+]
	// 数字栈 [3,2], 符号栈 [+,*]
	// 待入栈的2+, 遇到栈顶的2*里的乘号, 则需先pop(2*), 再计算(2*2=4), 再push(4+)
	// 数字栈 [3,4], 符号栈 [+,+]
	// 此时已遍历完, 站内只有+-了, 直接计算即可: 3+4+ = 7

	// 其中数字可能超过一位, 例如 123, 4563 等, 则需 cur 初值为 0, 并 cur = cur * 10 + (c - 'a') 来把字符串转为数字

	nums := []int{} // 数字栈
	ops := []byte{} // 符号栈
	cur := 0        // 遍历到的数字
	for _, c := range []byte(s + "+") { // 补全 "+" 是为了最后一对儿 num 和 op
		if c == ' ' { continue } // 不处理空格
		if c >= '0' && c <= '9' { // 遇到某位数字则 保留多位数字
			cur = cur*10 + int(c-'0') // 字符串转数字, 支持多位数字
		} else if l := len(nums); l == 0 || ops[l-1] == '+' || ops[l-1] == '-' { // 数字栈为空, 或, 栈顶为 +-, 则压栈
			nums = append(nums, cur); cur = 0  // 数字压栈, 压栈后, 清空当前数字
			ops = append(ops, c) // 符号压栈
		} else { // 遇到 */ 则 pop(), 并计算, 并 push()
			n := len(nums); topnum := nums[n-1]; nums = nums[:n-1] // nums.pop()
			o := len(ops); topop := ops[o-1]; ops = ops[:o-1] // ops.pop()

			tmp := 0 // 高优先级的 */ 的计算结果
			if topop == '*' {
				tmp = topnum * cur
			} else {
				tmp = topnum / cur
			}
            cur = 0

			nums = append(nums, tmp)
			ops = append(ops, c)
		}
	}
	return compute(nums, ops)
}

// 只有+-符号了
func compute(nums []int, ops []byte) int {
	n := len(nums)
    ans := nums[0]
	for i := 1; i < n; i++ {
		op := ops[i-1]
		if op == '+' {
			ans += nums[i]
		} else {
			ans -= nums[i]
		}
	}
	return ans
}

参考左神视频讲解

二、多语言解法

C p p / G o / P y t h o n / R u s t / J s / T s Cpp/Go/Python/Rust/Js/Ts Cpp/Go/Python/Rust/Js/Ts

cpp 复制代码
// cpp
go 复制代码
// go 同上
python 复制代码
# python
rust 复制代码
// rust
js 复制代码
// js
ts 复制代码
// ts
相关推荐
网络安全-杰克2 分钟前
2026面试自动化测试面试题【含答案】
自动化测试·软件测试·面试·职场和发展
大江东去浪淘尽千古风流人物28 分钟前
【VLN】VLN(Vision-and-Language Navigation视觉语言导航)算法本质,范式难点及解决方向(1)
人工智能·python·算法
努力学算法的蒟蒻1 小时前
day79(2.7)——leetcode面试经典150
算法·leetcode·职场和发展
2401_841495641 小时前
【LeetCode刷题】二叉树的层序遍历
数据结构·python·算法·leetcode·二叉树··队列
AC赳赳老秦1 小时前
2026国产算力新周期:DeepSeek实战适配英伟达H200,引领大模型训练效率跃升
大数据·前端·人工智能·算法·tidb·memcache·deepseek
CodeSheep程序羊2 小时前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展
2401_841495642 小时前
【LeetCode刷题】二叉树的直径
数据结构·python·算法·leetcode·二叉树··递归
budingxiaomoli2 小时前
优选算法-字符串
算法
我是咸鱼不闲呀2 小时前
力扣Hot100系列19(Java)——[动态规划]总结(上)(爬楼梯,杨辉三角,打家劫舍,完全平方数,零钱兑换)
java·leetcode·动态规划
学历真的很重要2 小时前
【系统架构师】第二章 操作系统知识 - 第二部分:进程与线程(补充版)
学习·职场和发展·系统架构·系统架构师