左小白的技术日常
Github
2020/08/30
Author: guoqzuo

判断一个字符串出现次数最多的字符,并输出其次数

在js处理数组时,有一个reduce方法是比较实用的,特别是计算字符串出现次数的时候。下面来逐步介绍,怎么用js写一个函数,显示判断一个字符串出现次数最多的字符,并输出其次数

let str = "ababadectwestsfdadsfb"
console.log(getMostChar(str))

function getMostChar(str) {

}

思路:我们先实现获取字符串中每个字符出现的次数

function getCharCount(str) {
  // 先把字符串切分为数组
  return str.split('').reduce((result, item) => {
    if (result[item] === undefined) {
      result[item] = 1
    } else {
      result[item]++
    }
    return result
  }, {})
}

上面的例子中,使用了Array.prototype.reduce,如果不知道reduce执行情况,就需要好好看下mdn的文档了,上面的代码其实等价于下面的代码,可以看到reduce使用第二参数时,

function getCharCount(str) {
  // 先把字符串切分为数组
  let result = {}
  str.split('').forEach(item => {
    if (result[item] === undefined) {
      result[item] = 1
    } else {
      result[item]++
    }
  })
  return result
}

执行下这个函数

console.log('每个字符串出现的次数', JSON.stringify(getCharCount(str)))
// {"a":4,"b":3,"d":3,"e":2,"c":1,"t":2,"w":1,"s":3,"f":2}

根据上面的例子,我们再来思考怎么获取出现次数最多的字符,其实在reduce里面每次的result我们可以获取到当前字符、以及其出现的次数。我们可以用一个变量来存储出现次数最多的字符,每次遍历是都与这个变量进行比较就可以了

let str = "ababadectwestsfdadsfb"
function getMostChar(str) {
  // 先把字符串切分为数组
  let mostChar = {
    count: 0,
    char: ''
  }

  let charCountObj = str.split('').reduce((result, item) => {
    if (result[item] === undefined) {
      result[item] = 1
    } else {
      result[item]++
    }

    if (result[item] > mostChar.count) {
      mostChar.count = result[item]
      mostChar.char = item
    }

    return result
  }, {})

  return {
    mostChar, // 出现次数最多的字符
    charCountObj, // 字符串中所有字符出现的次数
  }
}

上面的例子中mostChar输出了出现次数最多的字符以及其次数,那问题来了,如果字符串是 "aabbcc",那出现最多次数的字符就不只一个了,可能会是数组。我们需要对上面的例子再进行一些增强,如下

// 主要是修改当前字符和出现次数最多的字符相等的情况
if (result[item] > mostChar.count) {
  mostChar.count = result[item]
  mostChar.char = item
} else if (result[item] === mostChar.count) {
  if (typeof mostChar.char === 'string') {
    mostChar.char = [mostChar.char, item]
  } else {
    mostChar.char.push(item)
  }
}

以上就是完整实现了,完整demo参见:判断一个字符串出现最多的字符 | github