zoukankan      html  css  js  c++  java
  • 面试题-统计字符出现最大次数

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

    好了,我们开始做题吧。

    题目描述

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

    测试用例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

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

  • 相关阅读:
    tomcat简介与配置
    gitlab简介与配置
    cobbler自动装机服务简介与配置
    Linux中管理员用户与普通用户之间的切换
    kafka 学习
    Linux系统swappiness参数在内存与交换分区之间优化作用
    CentOS7中使用yum安装Nginx的方法
    配置两个Hadoop集群Kerberos认证跨域互信
    Linux shell中2>&1的含义解释
    解决SpringBoot多工程时jar包中注解不能扫描生效问题
  • 原文地址:https://www.cnblogs.com/cnroadbridge/p/13358149.html
Copyright © 2011-2022 走看看