1. 程式人生 > 其它 >【Leetcode記錄】棧與佇列

【Leetcode記錄】棧與佇列

想到未來如果換工作/run出去找工作也需要演算法

計劃跟著程式碼隨想錄開始刷題,但是解題過程中發現程式碼隨想錄主要用C++,Java的程式碼沒有特別的友好,

於是記錄下自己做不出的題目以及微調過的程式碼

棧與佇列

程式碼隨想錄題解

150. 逆波蘭表示式求值

class Solution {
    public int evalRPN(String[] tokens) {
         Stack<Integer> stack = new Stack();
         for(String token: tokens){
                char c = token.charAt(0);
                if(!isOpe(token)){
                    stack.push(Integer.valueOf(token));
                }else if(c == '+'){
                    stack.push(stack.pop() + stack.pop());
                }else if(c == '-'){
                    stack.push(- stack.pop() + stack.pop());
                    // 坑一: 誰減誰,誰除誰
                }else if(c == '*'){
                    stack.push(stack.pop() * stack.pop());
                }else if(c == '/'){
                    int num1 = stack.pop();
                    int num2 = stack.pop();
                stack.push( num2/num1);
                }
         }
         return stack.pop();
    }
    private boolean isOpe(String s){
        return s.length() == 1 & (s.charAt(0) < '0' || s.charAt(0) >'9');
        // 坑二:如何判斷是否是一個普通的數字,比較麻煩,可能要用正則來判斷
        //但是可以通過判斷符號,符號僅佔一位,
        //且符號可以簡單地計算
    }
}

347.前 K 個高頻元素

大頂堆

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int n : nums){
            map.put(n, map.getOrDefault(n, 0) + 1);
        }
        PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>((e1, e2) -> e2.getValue() - e1.getValue());
        //建大頂堆,塞進去全部,然後彈出來前k個即可
        //建小頂堆的思路反而是,塞進去全部,把小的彈出來,留k個大的,但顯然大頂堆比較麻煩,需要逐個取出來剩下的
        queue.addAll(map.entrySet());
        int[] ans = new int[k];
        for (int i = 0; i < k && !queue.isEmpty(); ++i){
            ans[i] = queue.poll().getKey();
        }
        return ans;
    }
}

小頂堆

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int n : nums){
            map.put(n, map.getOrDefault(n, 0) + 1);
        }
        PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>((e1,e2) -> e1.getValue() - e2.getValue());
        //建大頂堆,塞進去全部,然後彈出來前k個即可
        //建小頂堆的思路反而是,塞進去全部,把小的彈出來,留k個大的,但顯然大頂堆比較麻煩,需要逐個取出來剩下的
        queue.addAll(map.entrySet());
        int[] ans = new int[k];
        while(queue.size()>k){
            queue.poll();
        }
        for(int i = 0 ; i < k ;i++){
            ans[i] = queue.poll().getKey();
        }
        return ans;
    }
}