阅读 32

我也统计一下字符串中出现最多的字母与个数

我在上一篇文章对JS遍历数据的方法做了总结,现在趁着这个题目实战一下。

方案一

最常规的思路:用变量存储目标字母和个数,循环遍历不断更新结果。知识点:

  • new Set(arr) //Set去重,目标字符串长的话去重还是有必要的
  • Array.filter() // 筛选得到符合条件的新数组
const testStr = "aaaadddddssssgdhssssbbbbbuuuwmopqlsabcfwsqdghgukssuyutsudddddsasss" //其后方案均使用该测试数据

// 统计字符串中出现最多的字母与个数
const getStrMax = str => {
  const arr = str.split("");//转成数组
  const arrSet = new Set(arr);//去重

  let maxCount = 0;//记录最大数量
  let maxItem = [];//记录最大数量的字母,考虑到有重复,用了数组

  for (let value of arrSet.values()) {
    const count = arr.filter(item => {
      return item === value
    }).length;
    if (count > maxCount) {
      maxCount = count;
      maxItem = [value];
    } else if (count === maxCount) {
      maxItem.push(value);
    }
  }

  return {
    maxItem,
    maxCount
  }
}

console.log(getStrMax(testStr))//{ maxItem: [ 's' ], maxCount: 17 }
复制代码

方案二

思路:先获取每个字母出现的个数,再取出个数最多的那个。知识点:

  • Array.map() //遍历原数组得到想要的新数组
  • [...new Set(arr)] //扩展运算符,用于set结构转数组
  • Array.sort() //数组排序
//获取每个字母的数量
const getResult = str => {
  const arr = str.split("");//转成数组
  return [...new Set(arr)].map(value => {
    const count = arr.filter(item => {
      return item === value
    }).length
    return {
      value,
      count
    }
  })
}
//按count从大到小排序
const result = getResult(testStr).sort((a, b) => {
  return b.count - a.count
})
//第一个就是结果
console.log(result[0])
复制代码

方案三

思路:同方案二,只是应用reduce方法,减少了代码量。知识点:

  • Array.reduce() //遍历数组并累加指定的数据
  • Array.from() //类数组对象转数组
  • Object.entries() //对象转数组
const getByReduce = str => {
  return Array.from(str).reduce((obj, v) => {
    const objVal = obj[v] || 0;
    objVal === 0 ? obj[v] = 1 : obj[v] = objVal + 1
    return obj;
  }, {});
}
//转数组然后排序
const arr = Object.entries(getByReduce(testStr)).sort((a, b) => {
  return b[1] - a[1]
})

console.log(arr[0]);//[ 's', 17 ]
复制代码

写在最后

  • 吾爱吾码,但更爱真理。如有不正确或脱了裤子放屁的操作敬请指出。温柔些,脸皮薄……
  • 如有其他更好、炫酷抑或有趣的方案,欢迎评论留言。
关注下面的标签,发现更多相似文章
评论