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

编写JavaScript字符串字母出现次数统计函数及问题求助

解决JavaScript字母出现次数统计的问题

嘿,我来帮你搞定这个字母统计的麻烦!你用排序后比较相邻字符的思路本身没问题,但大概率是循环逻辑里的细节没处理好,比如计数器初始值、最后一个字符的收尾,才导致输出全是0。咱们一步步来修正,再给你更高效的方案。

先修正你的排序遍历思路

你的核心逻辑是对的,但几个关键点容易踩坑:

  • 计数器要从1开始(每个字符至少出现一次),而不是0
  • 遍历的时候要比较当前字符和前一个(避免越界)
  • 循环结束后必须手动处理最后一组字符(因为循环里只有遇到不同字符才会记录,最后一组没触发这个条件)

改进后的代码如下:

function countLetters(str) {
  // 处理空字符串的边界情况
  if (!str.trim()) return {};
  
  // 统一转小写,避免区分大小写(比如H和h算同一个)
  const sortedChars = str.toLowerCase().split('').sort();
  const countResult = {};
  let currentCount = 1;

  // 从第二个字符开始遍历,和前一个比较
  for (let i = 1; i < sortedChars.length; i++) {
    if (sortedChars[i] === sortedChars[i - 1]) {
      currentCount++;
    } else {
      // 遇到不同字符,记录前一个字符的次数
      countResult[sortedChars[i - 1]] = currentCount;
      currentCount = 1; // 重置计数器
    }
  }

  // 别忘了记录最后一组字符的次数
  countResult[sortedChars[sortedChars.length - 1]] = currentCount;
  return countResult;
}

// 测试一下
console.log(countLetters("Hello World"));
// 输出:{ d: 1, e: 1, h: 1, l: 3, o: 2, r: 1, w: 1 }

更高效的方案:用对象直接统计(无需排序)

排序的方法时间复杂度是O(n log n),其实我们可以直接遍历字符串,用对象存每个字母的次数,时间复杂度O(n),逻辑更简单:

function countLetters(str) {
  const countResult = {};
  const lowerStr = str.toLowerCase();

  for (const char of lowerStr) {
    // 可选:只统计字母,忽略空格、数字等非字母字符
    if (/[a-z]/.test(char)) {
      // 如果字符已存在就加1,不存在就初始化为1
      countResult[char] = (countResult[char] || 0) + 1;
    }
  }

  return countResult;
}

如何统计仅出现一次的字母?

拿到统计结果后,我们可以用Object.keys()过滤出值为1的字母:

const letterCounts = countLetters("Hello World");
const singleOccurrenceLetters = Object.keys(letterCounts).filter(char => letterCounts[char] === 1);
console.log(singleOccurrenceLetters); // 输出:["d", "e", "h", "r", "w"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:41:50