JSK*_*JSK 1 javascript algorithm hashmap
我正在尝试用字符串创建哈希映射,地图采用以下形式:
{ 'char': charOccurrence }
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
function compress(text) {
let hash = new Map();
let prev = [];
for (let i = 0; i < text.length; i++) {
let count = 0;
prev.push(text[i]);
for (let j = i+1; j < text.length; j++) {
// if (prev.indexOf(text[j]) !== -1) break;
if (text[i] === text[j]) {
count += 1;
console.log(count);
}
}
hash.set(text[i], count);
}
console.log(hash);
}
compress('aaaaahhhheaaadeee');
Run Code Online (Sandbox Code Playgroud)
问题count总是0,我不知道即使在影响for循环中的值之后这是怎么回事.这是我从这段代码中得到的:
Map { 'a' => 0, 'h' => 0, 'e' => 0, 'd' => 0 }
Run Code Online (Sandbox Code Playgroud)
我在这里缺少什么?
你正在覆盖以前的结果.
每次看到"a"时,都会从0开始计数并读取字符串的其余部分,然后将所有内容覆盖为hash您找到的总计数.字符串中的最后一个"a"将得到总计数0.这就是每个字母都会发生的事情.
prev你没有做任何事情,或许是为了防止这种情况发生.(你可以跳过你已经计算过的字母.)
这是一个更简单(更快)的方法:
function compress(text) {
let hash = new Map();
for (let i = 0; i < text.length; i++) {
hash.set(text[i], (hash.get(text[i]) || 0) + 1);
}
return hash;
}
console.log(compress('aaaaahhhheaaadeee'));
// Map { 'a' => 8, 'h' => 4, 'e' => 4, 'd' => 1 }
Run Code Online (Sandbox Code Playgroud)