You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript字符串字符计数展开函数输出重复问题排查

修复字符计数重复输出的问题

问题描述

需要实现一个函数:接收字符分组的字符串,返回每个字符后跟其总出现次数的新字符串。例如输入'aeebbccd',预期输出'a1e2b2c2d1'。但现有函数运行后得到的是'a1e2e2b2b2c2c2d1',重复输出了相同字符的计数结果。

原函数问题分析

原函数的核心问题是:外层循环遍历字符串的每一个字符,对每个字符都重复执行全字符串计数并追加结果。比如输入中的两个'e',会被分别处理两次,每次都输出'e2',最终导致结果重复。

解决方案

方案1:先统计后拼接(高效推荐)

先用一个对象统计所有字符的出现次数,再遍历对象拼接结果,时间复杂度为O(n),适合长字符串:

function strExpand(str) {
  const countMap = {};
  // 统计每个字符的出现次数
  for (const char of str) {
    countMap[char] = (countMap[char] || 0) + 1;
  }
  // 拼接结果字符串
  let result = '';
  for (const char in countMap) {
    result += char + countMap[char];
  }
  return result;
}

测试示例:

console.log(strExpand('aeebbccd')); // 输出 "a1e2b2c2d1"

方案2:基于原代码修改(最小改动)

添加一个集合记录已处理的字符,遇到重复字符直接跳过,避免重复输出:

function strExpand(str) {
  let results = "";
  const processed = new Set();

  for (let i = 0; i < str.length; i++) {
    const char = str.charAt(i);
    if (processed.has(char)) continue; // 跳过已处理的字符
    processed.add(char);
    
    let count = 0;
    for (let j = 0; j < str.length; j++) {
      if (str.charAt(j) === char) count++;
    }
    results += char + count;
  }
  return results;
}

说明

  • 方案1通过两次单循环完成统计和拼接,效率远高于原函数的嵌套循环(O(n²))。
  • 方案2仅在原代码基础上添加了去重逻辑,改动小,适合快速修复现有代码。

内容的提问来源于stack exchange,提问作者Antrhopos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 19:20:12