这是跟着代码随想录的顺序学习算法的第十三天。
以下是学习时自己的一些理解与笔记,如有错误欢迎指正与讨论。
150. 逆波兰表达式求值
参考相关链接:
笔记
逆波兰表达式在学习离散数学的时候接触过,算法实现不难,但每次看代码随想录的 JS
版本都得顿一会去理解一下大佬的简洁写法。
里面有行代码没看懂就去搜了一下,链接放这了,是阮一峰老师的教程。
"有一点需要特别注意,位运算符只对整数起作用,如果一个运算子不是整数,会自动转为整数后再执行。另外,虽然在 JavaScript 内部,数值都是以64位浮点数的形式储存,但是做位运算的时候,是以32位带符号的整数进行运算的,并且返回值也是一个32位带符号的整数。
i = i | 0;
上面这行代码的意思,就是将i
(不管是整数或小数)转为32位整数"
去idea上做了简单的测试:
console.log(-6.2 | 0); // -6
console.log(-1.7 | 0); // -1
console.log(5.1 | 0); // 5
console.log(3.7 | 0); // 3
题解代码:
// 自己做的
var evalRPN = function(tokens) {
if(tokens.length === 1) return tokens;
const stack = [];
for(const x of tokens){
switch(x) {
case '+':
stack.push(stack.pop() + stack.pop());
break;
case '-':
stack.push(-stack.pop() + stack.pop());
break;
case '*':
stack.push(stack.pop() * stack.pop());
break;
case '/':
const first = stack.pop();
const second = stack.pop();
let res = second / first;
// 对除法的结果进行取整处理
stack.push(res > 0 ? Math.floor(res) : Math.ceil(res));
break;
// 不是符号就正常输入,转化成数字
default : stack.push(parseInt(x));
}
}
return stack[0];
};
(膜拜大佬)
// 代码随想录JS版本
var evalRPN = function(tokens) {
const s = new Map([
["+", (a, b) => a * 1 + b * 1],
["-", (a, b) => b - a],
["*", (a, b) => b * a],
["/", (a, b) => (b / a) | 0] // 二进制位运算符
]);
const stack = [];
for (const i of tokens) {
if(!s.has(i)) {
stack.push(i);
continue;
}
stack.push(s.get(i)(stack.pop(),stack.pop()))
}
return stack.pop();
};