哈希表可用来 1,哈希映射 2,哈希去重
数组中重复的数字
一种是两层for循环,一种是先排序(sort())再遍历,都不如第三种设置哈希表用空间换时间快。
var findRepeatNumber = function(nums) {
const map=new Map();
for(let num of nums){
if(map.has(num)) return num;
else{map.set(num,true);}
}
return -1;
};
两数之和
var twoSum = function(nums, target) {
const m=new Map();
//m.has(key)返回布尔值 判断是否含有key
//m.get(key)返回value
//m.set(key,value)
//这里把值作为key,把索引作为value,更能避免重复
for(let i=0;i<nums.length;i++){
if(m.has(target-nums[i])) return [i,m.get(target-nums[i])];
else{m.set(nums[i],i)}
}
};
两个数组的交集
var intersection = function(nums1, nums2) {
return [...new Set(nums1)].filter(item=>nums2.includes(item));
};
扑克牌中的顺子
解题关键:
- 除了0不能有其他重复的牌
- 除0以外五张牌中最大的牌和最小的牌相差不能大于5
var isStraight = function(nums) {
const s=new Set();
for(let num of nums){
if(num===0) continue;
if(s.has(num)) return false;
s.add(num);
}
let max=Math.max(...s);
let min=Math.min(...s);
return max-min<5;
};
LRU缓存
创建map来保存数据
get:访问某key,访问完要将其放在最后的。若key存在,先保存value值,删除key,再添加key,最后返回保存的value值。若key不存在,返回-1
put:新加一个key,要将其放在最后的。所以,若key已经存在,先删除,再添加。如果容量超出范围了,将map中的头部删除。
如何删除map中的头部key:
map.keys()返回一个迭代器
这个迭代器调用next()方法,返回包含迭代器返回的下一个值,存在value属性中
class LRUCache {
constructor(capacity) {
this.capacity = capacity;
this.map = new Map();
}
get(key) {
if (this.map.has(key)) {
// get表示访问该值
// 所以在访问的同时,要将其调整位置,放置在最后
const temp = this.map.get(key);
// 先删除,再添加
this.map.delete(key);
this.map.set(key, temp);
// 返回访问的值
return temp;
} else {
// 不存在,返回-1
return -1;
}
}
put(key, value) {
// 要将其放在最后,所以若存在key,先删除
if (this.map.has(key)) this.map.delete(key);
// 设置key、value
this.map.set(key, value);
if (this.map.size > this.capacity) {
// 若超出范围,将map中头部的删除
// map.keys()返回一个迭代器
// 迭代器调用next()方法,返回包含迭代器返回的下一个值,在value中
this.map.delete(this.map.keys().next().value);
}
}
}