字典
字典与集合类似,也是一种存储唯一值的数据结构,字典以键值对的形式进行存储,在ES6中有字典Map。
字典的常用操作
增
使用set()方法可以向字典中添加新成员,可连续添加。
删
使用delete()方法可以删除字典成员,删除字典中不存在的成员不报错。
使用clear()方法清空字典成员。
改
使用set()方法可以向字典中添加新成员时,如果新成员的键已存在,那么将会覆盖以存在的键。
查
使用get()方法可以通过字典的键,来访问其对应的值,如果获取不存在的键,则返回undefined。
字典的应用
两个数组的交集(leetcode:349)
思路
新建一个字典,遍历nums1填充字典;
遍历nums2,遇到字典中的值就选出,并在字典中删除。
代码
var intersection = function(nums1, nums2) {
const m = new Map();
nums1.forEach(n => {
m.set(n, true);
});
const arr = [];
nums2.forEach(n => {
if(m.get(n)){
arr.push(n);
m.delete(n);
}
});
return arr;
};
两数之和(leetcode:1)
思路
建立一个集合,遍历数组;
如果当前元素和集合中的元素相加等于target, 则返回对应的下标;
不等于target,将当前元素做key,迭代变量(i)做value存入集合;
代码
var twoSum = function(nums, target) {
const m = new Map();
for(let i = 0;i < nums.length;i++){
const n1 = nums[i];
const n2 = target - n1;
if(m.has(n2)){
return [i, m.get(n2)];
}else{
m.set(n1, i);
}
}
};
无重复字符串的最长子串(leetcode:3)
思路
用双指针标记子串,不断移动右指针;
当遇见重复字符时,左指针移动到重复字符的下一位;
最后返回子串的长度;
代码
var lengthOfLongestSubstring = function(s) {
//定义左指针
let l = 0;
//定义子串长度初始为0
let len = 0;
//定义集合
const m = new Map();
//遍历字符串
for(let r = 0;r < s.length;r++){
//在标记的子串中,遇到重复字符,左指针移动到重复字符的下一位
if(m.has(s[r])&& m.get(s[r])>= l){
l = m.get(s[r]) + 1;
}
//获取子串的最大长度
len = Math.max(len, r - l + 1);
//将标记的子串,存入集合
m.set(s[r], r);
}
//返回子串的长度
return len;
};