• 【闲谈】如何统计字符串中出现最多的字母与个数


    前言

    闲来无事,穷折腾。最近我朋友在找工作,遇到一些面试题,或者遇到一些问题会及时跟我讨论。我则作为他的幕后军师,为他出谋划策。接下来我分享给大家一道简单的面试题。

    题目

    统计字符串中出现最多的字母与个数?

    分析

    1、验证数据是否字符串
    2、字符串转换为数组
    3、统计字符串出现的次数
    

    例:

    var str = 'aaaadddddssssgdhssssbbbbbuuuwmopqlsabcfwsqdghgukssuyutsudddddsasss';
    

    写一个函数专门处理这个事情。

    /**
    * 
    * 检查字符串中出现次数最多的那个
    * 
    */
    function maximum(s) {
        //【第一步】验证合法性
       if (typeof s !== 'string') {
           throw ('s is string');
        }
        //【第二步】转换为数组
        var array = s.split("");
        //【第三步】找出最多的字母
        //这一步最关键
    
    }
    

    其实最重要的是第三步,看你站在什么样的思路去找对应的字母与其个数。大多数人会选择使用两个循环进行处理。

    代码如下:

    /**
     * 检查字符串中出现次数最多的那个
     */
    function maximum(s) {
      if (typeof s !== "string") {
        throw "s is string";
      }
      var array = s.split(""),
        l = array.length,
        obj = {},
        ismaxObj = {
          max: 0,
          val: ""
        },
        arrayVal = "";
      while (l--) {
        arrayVal = array[l];
        if (!obj[arrayVal]) {
          obj[arrayVal] = [];
        }
        obj[arrayVal].push(arrayVal);
        if (ismaxObj.max != 0) {
          if (obj[arrayVal].length > ismaxObj.max) {
            ismaxObj.max = obj[arrayVal].length;
            ismaxObj.val = array[l];
          }
        } else {
          ismaxObj.max = obj[arrayVal].length;
          ismaxObj.val = arrayVal;
        }
      }
      //console.log(array);
      console.log(ismaxObj);//出现次数最多的字母与次数
      console.log(obj);//数据重组直观看到数据分布
    }
    
    maximum(
      "aaaadddddsgdhssssbbbbbuuupqlsabcfwsqdghgukssuyutsudddddsasss,ewfd,null,undefind.?Qzadsdvsf/\\[;ll;,lw"
    );
    

    结果如图所示:

    追问

    如果面试官追问,如何确定最多的字母的第一个位置与最后一个位置?
    其实我们在push的时候就可以把这个数据的位置存起来,稍加改动即可求出。

    /**
     * 检查字符串中出现次数最多的那个
     */
    function maximum(s) {
      if (typeof s !== "string") {
        throw "s is string";
      }
      var array = s.split(""),
        ll = array.length,
        obj = {},
        ismaxObj = {
          max: 0,
          val: ""
        },
        arrayVal = "";
      for (var l=0;l<ll;l++) {
        arrayVal = array[l];
        if (!obj[arrayVal]) {
          obj[arrayVal] = [];
        }
        obj[arrayVal].push(arrayVal+'-'+l);
        if (ismaxObj.max != 0) {
          if (obj[arrayVal].length > ismaxObj.max) {
            ismaxObj.max = obj[arrayVal].length;
            ismaxObj.val = array[l];
          }
        } else {
          ismaxObj.max = obj[arrayVal].length;
          ismaxObj.val = arrayVal;
        }
      }
      console.log(obj[ismaxObj.val][0],obj[ismaxObj.val][obj[ismaxObj.val].length-1]);//最多的字母的第一个位置与最后一个位置
      console.log(ismaxObj);//出现次数最多的字母与次数
      console.log(obj);//数据重组直观看到数据分布
    }
    


    这是我给出的方案,也许还不是最优质的。望各位大佬指正。

    总结

    其实对于面试来说最重要的是考察面试者处理问题的逻辑思路,有些人能够解决问题,有些人能够以最优质的方案解决问题。前者是干活的人,后者是干好活的人。

  • 相关阅读:
    Linux mint OS
    Patroni 修改配置
    0x10
    01
    split
    IO流18 --- RandomAccessFile实现数据的读写操作 --- 技术搬运工(尚硅谷)
    IO流16 --- 对象流操作字符串 --- 技术搬运工(尚硅谷)
    IO流15 --- 数据流操作Java语言的基本数据类型 --- 技术搬运工(尚硅谷)
    IO流14 --- 打印流的使用 --- 技术搬运工(尚硅谷)
    JDBC2 --- 获取数据库连接的方式二 --- 技术搬运工(尚硅谷)
  • 原文地址:https://www.cnblogs.com/xiaoxiaokun/p/10120733.html
Copyright © 2020-2023  润新知