面试题-统计字符出现最大次数

时间:2022-07-22
本文章向大家介绍面试题-统计字符出现最大次数,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

这题我在纠结到底命名成"求字符出现最大次数"还是"统计字符出现最大次数"好,后来我选择后者,求表示的是你只要找到最大的次数就好,你管它是谁有几个,而统计它所表示的含义是,你要把它具体给我列举出来。之所以有这个想法,是考虑到生活中的场景哪有那么巧啊,有可能有很多个相同的最大次数呢?

好了,我们开始做题吧。

题目描述

给定一串连续的字符串(无空格不间断),要求统计出该字符串中字符出现的最大次数,返回的格式是对象格式,具体的请看测试用例。

测试用例1

输入

happyeveryday

输出

{ y: 3 }

测试用例2

输入

ataolaismeiamfinedonotworry

输出

{ a: 4, o: 4 }

题解

先天真一下下

怎么个天真法呢,假定一串字符串,有且仅有一个最大的字符出现次数,具体多少次,有辣么多辣么多辣么多次,你尽管想。返回格式形如{ key: a, value: 5}这个,key表示出现的字符,value表示最大的次数。

好,首先我们可以定义一个对象obj={},之后我们一层遍历,如果这个对象的key有遍历字符我们就加1,如果没有我们设置它为1.到这一步,我们可以列举出所以字符出现的次数。接下来,我们就定义我们最开始的输出格式形如res = { key: '', value: 0 },我们把得到的obj的key遍历一次,跟我们预先设置的res的value做比较,如果比它大就进行相应赋值。到这一步,答案就很显而易见了。

function getMaxCountLetter(str) {
  const obj = {};
  for (let i = 0; i < str.length; i++) {
    if (obj[str[i]]) {
      obj[str[i]]++;
    } else {
      obj[str[i]] = 1;
    }
  }

  const res = {
    key: '',
    value: 0,
  }

  for (const key in obj) {
    if (obj[key] > res.value) {
      res.key = key;
      res.value = obj[key];
    }
  }
  return res;
}

再现实一点点

如果写出楼上的写法,面试的时候其实已经是放行了。但是生活往往是很多的不理想构成的理想社会。正所谓,too young too simple, sometimes navie. 那我们就进一步优化,我们把可能存在多个相同最大值的情况考虑进去。

好,我们接着讲。上面的思路直到获取obj对象都不用改动,我们接着只是想知道,最大的那位选手它的值是多少,它是谁我不care的。那么我们就要求其中的最大值,把obj对象的的值转成数组,然后ES6的扩展运算符转成string类型,再然后调用Math.max函数,到了这一步我们知道了最大次数。紧接着最普遍的做法就是遍历一遍obj的key,然后和这个max相等的,我们塞到返回结果中,具体实现如下:

function getMaxCountLetter(str) {
  const obj = {};
  for (let i = 0; i < str.length; i++) {
    if (obj[str[i]]) {
      obj[str[i]]++;
    } else {
      obj[str[i]] = 1;
    }
  }
  const max = Math.max(...Object.values(obj));
  const res = {};
  for (const key in obj) {
    if (obj[key] === max) {
      res[key] = max;
    }
  }
  return res;
}

原题出处: 浙大网新外包岗笔试题(改动版)

代码地址: http://zhengjiangtao.cn/coding/interview/count_letters.js

项目地址: https://github.com/ataola/coding