查找字符串中出现最多的字符和个数
实现一个函数,找出字符串中出现次数最多的字符及其出现次数
问题
给定一个字符串,需要找出其中出现次数最多的字符以及该字符出现的次数。如果有多个字符出现次数相同且都是最多的,可以返回其中任意一个。
解答
方法一:使用对象统计(推荐)
function findMostChar(str) {
// 边界处理
if (!str || str.length === 0) {
return { char: '', count: 0 };
}
// 使用对象统计每个字符出现的次数
const charMap = {};
for (let char of str) {
charMap[char] = (charMap[char] || 0) + 1;
}
// 找出出现次数最多的字符
let maxChar = '';
let maxCount = 0;
for (let char in charMap) {
if (charMap[char] > maxCount) {
maxChar = char;
maxCount = charMap[char];
}
}
return { char: maxChar, count: maxCount };
}
方法二:使用 Map 对象
function findMostCharWithMap(str) {
// 边界处理
if (!str || str.length === 0) {
return { char: '', count: 0 };
}
// 使用 Map 统计字符出现次数
const charMap = new Map();
for (let char of str) {
charMap.set(char, (charMap.get(char) || 0) + 1);
}
// 找出出现次数最多的字符
let maxChar = '';
let maxCount = 0;
for (let [char, count] of charMap) {
if (count > maxCount) {
maxChar = char;
maxCount = count;
}
}
return { char: maxChar, count: maxCount };
}
方法三:使用数组方法链式调用
function findMostCharWithArray(str) {
// 边界处理
if (!str || str.length === 0) {
return { char: '', count: 0 };
}
// 统计字符出现次数
const charMap = str.split('').reduce((map, char) => {
map[char] = (map[char] || 0) + 1;
return map;
}, {});
// 找出最大值
const maxEntry = Object.entries(charMap).reduce((max, current) => {
return current[1] > max[1] ? current : max;
});
return { char: maxEntry[0], count: maxEntry[1] };
}
使用示例
// 示例 1:普通字符串
const result1 = findMostChar('hello world');
console.log(result1); // { char: 'l', count: 3 }
// 示例 2:包含中文
const result2 = findMostChar('你好世界,世界你好');
console.log(result2); // { char: '世', count: 2 } 或 { char: '界', count: 2 }
// 示例 3:包含特殊字符
const result3 = findMostChar('aaa!!!bbb!!!');
console.log(result3); // { char: '!', count: 6 }
// 示例 4:空字符串
const result4 = findMostChar('');
console.log(result4); // { char: '', count: 0 }
// 示例 5:单个字符
const result5 = findMostChar('a');
console.log(result5); // { char: 'a', count: 1 }
// 示例 6:所有字符出现次数相同
const result6 = findMostChar('abc');
console.log(result6); // { char: 'a', count: 1 } (返回第一个遇到的)
关键点
-
数据结构选择:使用对象或 Map 来存储字符及其出现次数,时间复杂度为 O(n)
-
边界条件处理:需要考虑空字符串、单字符等特殊情况
-
遍历优化:只需要遍历字符串两次(一次统计,一次查找最大值),保证性能
-
字符类型支持:代码支持所有 Unicode 字符,包括中文、emoji 等
-
返回格式:返回对象格式
{ char, count },便于使用和扩展 -
Map vs Object:Map 对象在频繁增删操作时性能更好,且 key 可以是任意类型;普通对象更简洁直观
-
空间复杂度:O(k),其中 k 是字符串中不同字符的个数
目录