这一帖用来写Map对象的一些使用注意事项:
1.Map的key是指同一个引用,也就是引用比较,而不是值比较,什么意思?上代码:
const minimumLengthEncoding = (words) => {
let map = new Map();
const buildTrie = (words) => {
let root = {};
for(const word of words){
const len = word.length;
let node = root;
for(let i = len - 1; i >= 0; i--){
const c = word[i];
if(!node[c]) node[c] = {};
node = node[c];
if(i == len - 1){
if(!node[c]) map.set(c, 0);
const pre = map.get(c);
const cur = Math.max(pre, len);
map.set(c, cur);
console.log(map.get("e"));
}
}
}
return root;
};
let trie = buildTrie(words);
return map;
};
这段代码是我在做LC-820时候写的初步代码,在建立字典树的过程中发现,哈希表map里面的值出现了bug:
也就是这一段:
if(!node[c]) map.set(c, 0);
const pre = map.get(c);
const cur = Math.max(pre, len);
map.set(c, cur);
console.log(map.get("e"));
bug的原因:Map对象的key是引用比较,你上一个来的确实是“e”,下一个单词的插入来的也是“e”,两个值是一样的,但是引用不一样,所以Map当成不同的东西。
解决方案:用{},相较于Map的缺点有很多,最重要的就是性能不如Map。