LeetCode字符串排列题中JS字符计数代码的差异疑问
LeetCode字符串排列问题的字符计数代码差异分析
原参考代码的作用是统计字符串s1中每个字符的出现次数,逻辑正确:
let neededChar = {}; for (let i = 0; i < s1.length; i++) { neededChar[s1[i]] = (neededChar[s1[i]] || 0) + 1; }
- 字符首次出现时,
neededChar[s1[i]]为undefined,undefined || 0取0,加1后赋值为1,正确记录首次出现次数 - 字符重复出现时,直接取已有计数值加1,更新计数
以下是你改写的两种写法的问题分析:
写法1的错误
neededChar[s1[i]] = neededChar[s1[i]] ? neededChar[s1[i]]++ : 0;
- 首次出现字符时,
neededChar[s1[i]]为undefined,走else分支赋值0,本该赋值1,计数直接少1 - 重复出现字符时,
neededChar[s1[i]]++是后置自增,会先返回当前值再自增。比如当前值是1,赋值时会把1重新赋给neededChar[s1[i]],之后才自增到2,但赋值覆盖了自增结果,最终计数值还是1,完全无法正确统计重复次数
写法2的错误
if(neededChar[s1[i]]){ neededCharp[s1[i]]++; }else{ needChar[s1[i]] = 0; }
- 拼写错误:
neededCharp和needChar都是笔误,应该是neededChar,这会直接导致变量未定义报错 - 逻辑错误:else分支赋值0是错的,首次出现字符应该赋值1,否则所有字符的初始计数都是0,后续自增后也会比实际次数少1,导致整个计数逻辑失效
内容的提问来源于stack exchange,提问作者LearnToCode
相关产品推荐
相关产品推荐

