ES6 字典(Map)

這是我參與8月更文挑戰的第4天,活動詳情查看:8月更文挑戰javascript

ES6字典Map, 是一種存儲惟一值的數據結構,也是以鍵值對的形式來存儲的。 爲了彌補javascript默認的對象 key只能是字符串或者 Symbols。 Map結構的Key能夠是任意類型。java

Map 和 Object 的區別

  • Key: Object只能是string 或者 symbol 類型做爲Key.
  • 屬性順序: Map中的鍵值是有序的,而Object不是
  • size: Map中鍵值對個數能夠用size獲取,而Object要手動計算

基本方法

let myMap = new Map()

myMap.set(1, 1)
myMap.set('a', 'a')

myMap.get(1)

myMap.delete(1);
myMap.clear() // {}


複製代碼

刷幾道LeetCode感覺一下吧

LeetCode-349: 數組的交集數組

示例 1:

輸入:nums1 = [1,2,2,1], nums2 = [2,2]
輸出:[2]
示例 2:

輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出:[9,4]

來源:力扣(LeetCode)
複製代碼
/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number[]} */
var intersection = function(nums1, nums2) {
    const map = new Map()
    nums1.forEach(n => {
        map.set(n, true)
    })
    const res = []
    nums2.forEach(n => {
        if (map.get(n)) {
            res.push(n)
            map.delete(n)
        }
    })
    return res
};
複製代碼

LeetCode-20: 有效的括號markdown

**示例 1:**

輸入: s = "()"
輸出: true

**示例 2:**

輸入: s = "()[]{}"
輸出: true

提示: 
   `s` 僅由括號 `'()[]{}'` 組成
複製代碼
/** * @param {string} s * @return {boolean} */


var isValid = function(s) {
    const len = s.length
    if (len % 2 !== 0) return false
    const stack = []
    const map = new Map()
    
    // 將左括號 與 右括號 分別做爲 map 的鍵值對
    map.set('(', ')')
    map.set('[', ']')
    map.set('{', '}')
    
    for (let i = 0; i < s.length; i ++) {
        const c = s[i];
        if (map.has(c)) {
            // 左括號就入棧
            stack.push(c)
        } else {
            // 碰見右括號就須要 對比一下
            const t = stack[stack.length - 1]
            if (map.get(t) === c) {
                stack.pop()
            } else {
                return false
            }
        }
    }
    
    return stack.length === 0
};

複製代碼

LeetCode-1: 兩數之和數據結構

/** * @param {number[]} nums * @param {number} target * @return {number[]} */
var twoSum = function(nums, target) {

    const map = new Map()
    for (let i = 0; i < nums.length; i ++) {
        const n = nums[i]
        const n2 = target - n
        if (map.has(n2)) {
            return [map.get(n2), i]
        } else {
            map.set(n, i) // 設置當前元素的值和下標
        }
    }

};
複製代碼

LeetCode-3: 無重複子串長度app

/** * @param {string} s * @return {number} */
var lengthOfLongestSubstring = function(s) {
    let l = 0
    let res = 0
    const map = new Map()
    for (let r = 0; r < s.length; r++) {
        if (map.has(s[r]) && map.get(s[r]) >= l) { 
            // 若是字典裏有重複字符串,就把左指針移到重複字符串位置
            l = map.get(s[r]) + 1
        }
        res = Math.max(res, r - l + 1) // 滑動窗口
        map.set(s[r], r)
    }
    return res
};
複製代碼

LeetCode-76: 最小覆蓋子串oop

示例 1:

輸入:s = "ADOBECODEBANC", t = "ABC"
輸出:"BANC"
示例 2:

輸入:s = "a", t = "a"
輸出:"a"
示例 3:

輸入: s = "a", t = "aa"
輸出: ""
解釋: t 中兩個字符 'a' 均應包含在 s 的子串中,
所以沒有符合條件的子字符串,返回空字符串。

來源:力扣(LeetCode)
複製代碼
/** * @param {string} s * @param {string} t * @return {string} */
var minWindow = function(s, t) {
    let l = 0;
    let r = 0;
    const need = new Map()
    for (let c of t) {
        need.set(c, need.has(c) ? need.get(c) + 1 : 1)
    }
    // need{A->1, B->1, C->1}, 設置每一個字符須要的個數

    let needType = need.size;
    let res = ""
    while(r < s.length) {
        const c = s[r]
        // 移動右指針
        if (need.has(c)) {
            need.set(c, need.get(c) - 1)
            if (need.get(c) === 0) needType -= 1
        }
        // 移動左指針
        while(needType === 0) {
            const newRes = s.substring(1, r + 1);
            if (!res || newRes.length < res.length) res = newRes
            const c2 = s[l];
            if (need.has(c2)) {
                // 左指針包含目標值, 則須要移動右指針,繼續尋找到目標值
                need.set(c2, need.get(c2) + 1)
                if (need.get(c2) === 1) needType += 1
            }
            l += 1;
        }

        r += 1;

    }
    return res
};
複製代碼
相關文章
相關標籤/搜索