持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
150. 逆波兰表达式求值
题目分析
题目要求逆波兰表达式的值,逆波兰表达式是一种后缀表达式就是算符写在后面的一种表达式。
逆波兰表达式具有两个优点:
第一个是去掉括号后表达式无歧义。第二个是适合用栈操作,运算遇到数字入栈遇到运算符则栈顶的两个数字出栈进行运算,运算后将结果压入栈中。
解题
这道题的解决类似于前面的相邻重复项相除的解法。需要注意的是栈的操作。首先将操作符及对应的操作存入map中,接下来遍历判断是否为map中的字符,如果不是的话就是数字进行压栈操作,如果map中存在,则进行相应运算后再压入栈中。
代码如下:
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();
};
347.前 K 个高频元素
题目分析
本题给定一个非空的整数数组要求返回其中出现频率前K高的元素。本题需要做几项操作,首先要统计元素出现的频率,接下来要对元素出现的频率进行排序,最后找出前K个高频元素。
解题
对于统计元素出现的频率,我们应该并不陌生。可以通过map的方式统计。首先创建一个map初始化出现次数为一,之后遍历的时候每出现一次加一。接下来判断K如果等于map的size,则key全部返回。否则通过sort进行由大到小的排序,截取前K个key返回。
代码如下:
var topKFrequent = function(nums, k) {
let map = new Map();
for(let num of nums) {
map.set(num, map.has(num) ? map.get(num) + 1 : 1);//初始化出现次数为1,之后累加
}
if(k === map.size) return [...map.keys()];//k如果等于map.size,直接返回全部key
let arr = Array.from(map).sort((a, b) => {return b[1] - a[1]});//从大到小排序
return arr.slice(0, k).map(n => n[0])//截取前k个key
};
总结
这两道题解题方式并不困难,但是需要理解的东西比较复杂。