代码随想录算法训练营第十一天 | 150. 逆波兰表达式求值、347.前 K 个高频元素

71 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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
};

总结

这两道题解题方式并不困难,但是需要理解的东西比较复杂。