JavaScript实现字符串连续字符计数 修复代码无法获取首元素问题
连续重复字符计数格式转换代码问题排查与修正
需求为统计字符串中连续重复字符的出现次数,将原字符串转换为「字符+连续出现次数」的格式,例:
- 输入
"aaabccdd",输出"a3b1c2d2" - 输入
"aabbcdd",输出"a2b2c1d2"
原代码核心问题
- 首字符处理逻辑遗漏:循环从索引0启动时,首字符对应的
i-1值为undefined,原代码的非重复字符判断分支加了string[i-1] !==undefined的限制,直接跳过了首字符的处理流程,首字符从始至终不会被写入结果字符串。 - 结果拼接时机错误:只要当前字符和下一个字符相等就立刻执行拼接,会导致同一组连续字符被重复写入。以连续3个
a的场景为例,i=0时会拼接a2,i=1时又会拼接a3,最终生成冗余错误内容。 - 末尾边界缺失:循环遍历到字符串最后一位时,
i+1为undefined,原代码没有针对最后一组连续字符的收尾拼接逻辑,会丢失末尾的字符统计结果。 - 存在无效代码:函数定义了从未被使用的
len形参,属于冗余内容。
修正逻辑
- 移除无效的
len参数,新增空输入边界判断,避免传入空字符串时报错。 - 初始化计数变量默认值为1,从字符串第二个字符(索引1)开始遍历,降低边界判断复杂度。
- 遍历过程中每次比较当前字符和上一个字符:相等则计数累加1;不相等则先把上一个字符和对应的计数拼接到结果,再将计数重置为1。
- 循环结束后,单独拼接最后一组连续字符和对应的计数,避免末尾内容丢失。
修正后可运行代码
function check(string) { if (!string) return ""; let new_string = ""; let count = 1; for (let i = 1; i < string.length; i++) { if (string[i] === string[i-1]) { count++; } else { new_string += string[i-1] + count; count = 1; } } // 拼接最后一组字符的统计结果 new_string += string[string.length - 1] + count; console.log(new_string); return new_string; } // 测试验证 check("aaabccdd"); // 输出 a3b1c2d2 check("aabbcdd"); // 输出 a2b2c1d2 check("a"); // 输出 a1 check("aaaa"); // 输出 a4
首字符丢失的根本原因
原代码的两个拼接分支都没有覆盖首字符场景:重复字符分支在匹配到相等时拼接的是下一位字符(
string[i+1]),非重复字符分支直接排除了i=0的首字符场景,导致首字符永远不会被写入结果。
内容的提问来源于stack exchange,提问作者Debasis Tripathy
相关产品推荐
相关产品推荐

