JavaScript:如何统计字符串重复字符并紧随其后输出计数?
解决字符串压缩:从"aaabbccccddd"到"a3b2c4d3"的正确实现
嘿,我来帮你搞定这个字符串压缩的问题~你的现有代码只统计了连续重复字符的次数,却没把结果拼接成需要的格式,还有几个小bug需要调整,咱们一步步来:
你的代码存在的问题
- 计数器初始值错误:你把
countNumberLetter设为0,但每个字符至少出现1次,最后统计的次数会比实际少1 - 未处理字符切换场景:当遇到不同字符时,没有把当前统计的字符和次数存入结果,也没重置计数器
- 遗漏最后一组字符:循环到最后一个字符时,
i+1会超出字符串长度,不会触发相同字符的判断,导致最后一组字符的统计结果没被加入 - 输出时的无效引用:循环结束后
i等于字符串长度,countLetters[i]是undefined,这会导致输出错误
修正后的完整代码
const countLetters = "aaabbccccddd"; let result = ""; let countNumberLetter = 1; // 初始为1,每个字符至少出现一次 for (let i = 0; i < countLetters.length; i++) { // 比较当前字符与下一个字符 if (countLetters[i] === countLetters[i + 1]) { countNumberLetter++; } else { // 字符不同时,将当前字符和次数拼入结果 result += countLetters[i] + countNumberLetter; // 重置计数器,准备统计下一组字符 countNumberLetter = 1; } } console.log(result); // 输出:a3b2c4d3
代码逻辑解释
- 初始化
result空字符串,用来存储最终的压缩结果 countNumberLetter从1开始计数,因为每个字符至少出现一次- 遍历字符串时,每次对比当前字符和下一个字符:
- 如果相同,计数器加1
- 如果不同(包括最后一个字符,此时
countLetters[i+1]为undefined),就把当前字符和统计次数拼到result里,然后重置计数器
- 循环结束后,
result就是我们需要的压缩格式
更简洁的正则实现
如果你想更高效,还可以用正则表达式一行搞定:
const countLetters = "aaabbccccddd"; const result = countLetters.replace(/(.)\1*/g, (match, char) => char + match.length); console.log(result); // 输出:a3b2c4d3
这个正则的逻辑是:(.)捕获任意单个字符,\1*匹配该字符的连续重复项,然后把匹配到的内容替换成「捕获的字符 + 匹配内容的长度」。
内容的提问来源于stack exchange,提问作者user9502376
相关产品推荐
相关产品推荐

