输出字符串中出现次数最多的字符和次数

488 阅读4分钟

面试过程中,同事提出了如题的编程题,练完手之后记录如下,具体运行情况请看 这里

window.onload = function(){
  (function(){
    let btn = document.getElementById('btn')
    btn.addEventListener('click', function(){
      let value = document.getElementById('text').value
      if(value){
         let result = getChatMethod2(value)
         document.getElementById('str').innerText = `name: ${result.name}`
         document.getElementById('num').innerText = `num: ${result.num}`
      }else{
        alert('请输入数据')
      }
    }, false)
   
  })()
  
  /*
   * 方法1
   * 1. 把字符变成数组
   * 2. 然后对数组进行遍历,把对应的字符和次数保存起来obj
   * 3. 对obj遍历获取最大值
   * 4. 处理重复key的情况
   */
  function getChatMethod1(str){
    let obj = {}
    str.split('').forEach((cur, index, origin) => {
      if(obj[cur]){
        obj[cur] = obj[cur] + 1
      }else{
        obj[cur] = 1
      }
    })
    
    let maxNum = 0
    let maxKey = ''
    for(let key in obj){
      if(obj[key] == maxNum){
        if(Array.isArray(maxKey)){
          maxKey = maxKey.concat(key)
        }else{
          maxKey = [].concat(maxKey, key)
        }
        maxNum = obj[key]
        continue;
      }
      if(obj[key] > maxNum){
        maxKey = key
        maxNum = obj[key]
      }
    }
    return {name: maxKey, num: maxNum}
  }
  
   /*
   * 方法2
   * 1. 把字符变成数组
   * 2. 然后对数组进行sort排序
   * 3. 对排序后的数组进行相邻比较,看下出现最多的是哪个
   * 4. 算法优化(TODO)
   */
  function getChatMethod2(str){
    let newArr = str.split('').sort()
    
    let curKey = newArr[0]
    let curNum = 1
    
    let maxKey = ''
    let maxNum = 0
    for(let i = 1; i < newArr.length; i++){
      
      if(newArr[i] == curKey){
        curNum++
      }
      if(newArr[i] != curKey || i == newArr.length - 1){
        if(curNum > maxNum){
          maxNum = curNum
          maxKey = curKey + ","
        } else if (curNum == maxNum) {
          maxKey += curKey+','
        }
        curNum = 1
        curKey = newArr[i]
      }
    }
    return {name: maxKey, num: maxNum}
  }
}


最近一段时间和公司另一位同事参与了项目组的前端人员面试,这个过程其实感触很多且感觉给自己成长了不少。

面试的流程基本即使提问问题并交流技术的过程,我们是两个同事一起面试的,问的问题并没有什么思路,而是想到什么就问什么,其实我是有准备好题目而已有计划提问的,可是由于临时决定两个人一起面试,然后没有什么默契就问得很凌乱,我觉得这个不是很友好,对被面试着来说,可能考察了下他的灵活性,可是由于css,js问题之类的都是分散开来的,那就不能系统地评估他的综合能力;而且这样的提问方式,不能体现出面试官的专业性(虽然也不是很6)。

对于被面试者来说,从他们的 回答 中,仿佛看到了自己面试时的回答。我觉得比较好的回答模版应该是这样的:

  1. 首先要把思路表达清楚;
  2. 接着才是代码的具体实现,需要把关键的属性和方法描述出来(最好能有实际项目的示例);
  3. 再者可以加上实现方案中的一些内部原理;
  4. 后续可以拓展的就还有好多啦,比如内部的一些性能、安全、优化等等
  5. ...

面试的时候我提了一个问题:请谈谈AJAX原理的理解。结果被面试者把jqueryajax中的常用属性和方法怎么用的描述了一下...emmmm,当时就有点小尴尬了,我觉得这就有点答非所问了。还有一个比较尴尬的是,这个时候我不知道怎么回应他...我试过再问说内部原理了解吗,一般会回答不了解...此时此刻就感觉有点尴尬了,最糟的是,我有点觉得是因为我导致这样的尴尬。。。

提问方式,emmmm,之前面试的时候有让我比较舒服的面试官表现都会比较谦逊,曾经有一位面试官还会先自我介绍,然后再问问哪部分比较熟悉,他再提问...我就觉得这样的面试官就很专业且细心,我也想要成为这样令自己佩服的人...

一般现在如果是我提问的话,我会分几部分:

  1. 项目经验,会再简历上挑选项目经验深入提问: 设计思路、问题处理、职责分工、工程构建、性能优化、兼容处理,网络请求,and so on ;
  2. 工具的使用:git/开发工具/debugger工具等等
  3. 原理提问:Javascript原生的常见内容,原型、闭包、作用域、es6+、webpack 等等;CSS布局、动画、兼容 and so on;
  4. 如果还ok的话,会问下设计模式、浏览器、网络请求 and so on;
  5. ...

暂时就这个流程,一般不知道大家觉得哪个比较重要?我觉得这个流程ok的原因是,如果一来就问原生的,估计会让被面试者失去耐心和信心,虽然这是必须的,可是由于公司这边的招聘,并不是为了人员储备,所以,能开发业务其实就OK,所以...(大家懂的 ...)

...未完再续