1. 程式人生 > >【閒談】如何統計字串中出現最多的字母與個數

【閒談】如何統計字串中出現最多的字母與個數

前言

閒來無事,窮折騰。最近我朋友在找工作,遇到一些面試題,或者遇到一些問題會及時跟我討論。我則作為他的幕後軍師,為他出謀劃策。接下來我分享給大家一道簡單的面試題。

題目

統計字串中出現最多的字母與個數?

分析

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);//資料重組直觀看到資料分佈
}


這是我給出的方案,也許還不是最優質的。望各位大佬指正。

總結

其實對於面試來說最重要的是考察面試者處理問題的邏輯思路,有些人能夠解決問題,有些人能夠以最優質的方案解決問題。前者是幹活的人,後者是幹好活的人。