這是我參與8月更文挑戰的第4天,活動詳情查看:8月更文挑戰javascript
ES6字典Map, 是一種存儲惟一值的數據結構,也是以
鍵值對
的形式來存儲的。 爲了彌補javascript默認的對象 key只能是字符串或者 Symbols。 Map結構的Key能夠是任意類型。java
let myMap = new Map()
myMap.set(1, 1)
myMap.set('a', 'a')
myMap.get(1)
myMap.delete(1);
myMap.clear() // {}
複製代碼
示例 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) // 設置當前元素的值和下標
}
}
};
複製代碼
/** * @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
};
複製代碼
示例 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
};
複製代碼