Arts 第六週(4/22 ~ 4/28)

ARTS是什麼?
Algorithm:每週至少作一個leetcode的算法題;
Review:閱讀並點評至少一篇英文技術文章;
Tip:學習至少一個技術技巧;
Share:分享一篇有觀點和思考的技術文章。javascript

Algorithm

題目一
java

LC 146. LRU Cache node

解答
git

設計一個 LRU 緩存,因爲緩存容量有限,所以存在末尾淘汰,容量滿了,最不經常使用的(Least Recently Used)元素會被移出緩存。要保證查詢和增添元素的時間複雜度都是 O(1)。這道題看了一下網上的解法,貌似用數組也是能夠實現的,可是數組裏面還要存一個變量來表示該元素的新舊程度,固然時間複雜度的話就不是 O(1) 的了。常規的實現方法是雙向鏈表加上散列,固然對於 Java 來講還可使用 LinkedHashMap 這樣的數據結構,就會讓實現變得很是簡單,其實 LinkedHashMap 內部已經幫你實現好了不少東西,你不用在手動實現,這裏仍是用最原始的方法來一步一步實現:算法

實現參考代碼segmentfault

private class Node {
    Node next, prev;
    int key, value;
    Node(int key, int value) {
        this.key = key;
        this.value = value;
    }
}

private Node head;
private Node tail;
private int capacity;
private Map<Integer, Node> map;

public LRUCache(int capacity) {
    head = new Node(-1, -1);
    tail = new Node(-1, -1);
    tail.prev = head;
    head.next = tail;
    
    this.capacity = capacity;
    
    map = new HashMap<Integer, Node>();
}

public int get(int key) {
    if (!map.containsKey(key)) {
        return -1;
    }
    
    Node cur = map.get(key);
    
    deleteNode(cur);
    add2Head(cur);
    
    return cur.value;
}

public void put(int key, int value) {
    if (map.containsKey(key)) {
        Node cur = map.get(key);
        cur.value = value;
        deleteNode(cur);
        add2Head(cur);
    } else {
        if (map.size() == capacity) {
            map.remove(tail.prev.key);
            deleteNode(tail.prev);
        }

        Node newNode = new Node(key, value);

        add2Head(newNode);

        map.put(key, newNode);            
    }
}

private void add2Head(Node node) {
    node.next = head.next;
    head.next.prev = node;
    node.prev = head;
    head.next = node;
}

private void deleteNode(Node node) {
    node.prev.next = node.next;
    node.next.prev = node.prev;
}
複製代碼

Review

在 medium 上的一篇關於 Unit test 斷言的文章:
數組

Rethinking Unit Test Assertions緩存

測試對於代碼的重要性不言而喻,其中斷言是一個測試的關鍵,做者在文章的開始就給出,對於每個 unit test 咱們都要去問這 5 個問題:數據結構

  • 這個測試測試的是什麼東西(函數、模塊、類、等等)?
  • 那這個東西的功能是什麼?
  • 實際的輸出是什麼?
  • 指望的輸出是什麼?
  • 怎樣讓失敗重現?

文章中指出斷言越簡單越好,最好就只用 deep equal,其餘的複雜的斷言形式沒有必要,並且會把 unit test 弄得過於複雜,後期根據需求變化更改 test 的話就會不太容易框架

Tip

此次分享兩個更改 Mac 工做環境的小設置:

  1. 去到 Mac 系統設置的 keyboard 欄把 「Key Repeat」 和 「Delay Until Repeat」 兩項都設置成最快和響應時間最短,好處是打字和敲代碼變得比以前流暢很多,並且用上下左右移動光標的時候更加的快捷和方便

  2. 使用 iTerms + Oh-my-zsh 去更改 Terminal 的顯示問題,Mac 自帶的 Terminal 無法顯示 git 的分支之類的信息,設置完成以後感受比以前看的更加的美觀和舒服,配置教程以下:


iTerm2 + Oh My Zsh 打造溫馨終端體驗

效果圖:


Share

股票買賣問題是 LeetCode 的一個系列問題,這裏總結了一個動態規劃的狀態定義的框架,用來解決這一系列的問題

股票問題彙總

相關文章
相關標籤/搜索