class Solution {
public:
int calculate(string s) {
}
};
面试题 16.26. 计算器
给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。
表达式仅包含非负整数,+
, -
,*
,/
四种运算符和空格
。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2" 输出: 7
示例 2:
输入: " 3/2 " 输出: 1
示例 3:
输入: " 3+5 / 2 " 输出: 5
说明:
eval
。原站题解
java 解法, 执行用时: 14 ms, 内存消耗: 41.5 MB, 提交时间: 2022-11-30 23:28:15
class Solution { public int calculate(String s) { Deque<Integer> stack = new ArrayDeque<Integer>(); char preSign = '+'; int num = 0; int n = s.length(); for (int i = 0; i < n; ++i) { if (Character.isDigit(s.charAt(i))) { num = num * 10 + s.charAt(i) - '0'; } if (!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ' || i == n - 1) { switch (preSign) { case '+': stack.push(num); break; case '-': stack.push(-num); break; case '*': stack.push(stack.pop() * num); break; default: stack.push(stack.pop() / num); } preSign = s.charAt(i); num = 0; } } int ans = 0; while (!stack.isEmpty()) { ans += stack.pop(); } return ans; } }
golang 解法, 执行用时: 4 ms, 内存消耗: 5.9 MB, 提交时间: 2022-11-30 23:27:58
func calculate(s string) (ans int) { stack := []int{} preSign := '+' num := 0 for i, ch := range s { isDigit := '0' <= ch && ch <= '9' if isDigit { num = num*10 + int(ch-'0') } if !isDigit && ch != ' ' || i == len(s)-1 { switch preSign { case '+': stack = append(stack, num) case '-': stack = append(stack, -num) case '*': stack[len(stack)-1] *= num default: stack[len(stack)-1] /= num } preSign = ch num = 0 } } for _, v := range stack { ans += v } return }
javascript 解法, 执行用时: 108 ms, 内存消耗: 46.4 MB, 提交时间: 2022-11-30 23:27:43
/** * @param {string} s * @return {number} */ var calculate = function(s) { s = s.trim(); const stack = []; let preSign = '+'; let num = 0; const n = s.length; for (let i = 0; i < n; ++i) { if (!isNaN(Number(s[i])) && s[i] !== ' ') { num = num * 10 + s[i].charCodeAt() - '0'.charCodeAt(); } if (isNaN(Number(s[i])) || i === n - 1) { switch (preSign) { case '+': stack.push(num); break; case '-': stack.push(-num); break; case '*': stack.push(stack.pop() * num); break; default: stack.push(stack.pop() / num | 0); } preSign = s[i]; num = 0; } } let ans = 0; while (stack.length) { ans += stack.pop(); } return ans; };
python3 解法, 执行用时: 88 ms, 内存消耗: 59.4 MB, 提交时间: 2022-11-30 22:30:23
class Solution: def calculate(self, s: str) -> int: return eval(s.replace('/', '//'))