查找字符串中出现最多的字符和个数

实现一个函数,找出字符串中出现次数最多的字符及其出现次数

问题

给定一个字符串,需要找出其中出现次数最多的字符以及该字符出现的次数。如果有多个字符出现次数相同且都是最多的,可以返回其中任意一个。

解答

方法一:使用对象统计(推荐)

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 是字符串中不同字符的个数