编写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
相关产品推荐
相关产品推荐

