輸出字串中出現次數最多的字元和次數

minhuaF發表於2018-11-19

面試過程中,同事提出瞭如題的程式設計題,練完手之後記錄如下,具體執行情況請看 這裡

輸出字串中出現次數最多的字元和次數

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,所以...(大家懂的 ...)

...未完再續

相關文章