一個感覺很平凡的,常常在面試中出現的題目,擁有各種實現形式也就顯示出 JS 水平的不同。
首先,簡單的來一個基本思路的計算方式:
function maxNumLetter( str ){ var lettersObj = {}, len = str.length, letter, letterNum, maxLetter, maxNumber = 0; while( len-- ){ letter = str.substr(len, 1); letterNum = lettersObj[ letter ] = ( lettersObj[ letter ] || 0 ) + 1; if( letterNum > maxNumber ){ maxLetter = letter; maxNumber = letterNum; }else if( letterNum === maxNumber ){ ( maxLetter instanceof Array) ? maxLetter.push( letter ) : ( maxLetter = [ maxLetter, letter ] ); } } return maxLetter.toString(); }
上面是基本實現形式,對字符串的每個字母進行遍歷,並且在 lettersObj 進行緩存記錄,不過每次循環都對字符串進行截取字母看着總是有點不爽,那么可以先將字符串通過 split 進行數組化在進行循環遍歷,或者使用字符串的 replace 方式進行處理:
function maxNumLetter( str ){ var lettersObj = {}, letterNum, maxLetter, maxNumber = 0; str.replace(/[a-zA-Z]/g, function( l ){ var lNum = (lettersObj[ l ] || 0 ) + 1; letterNum = lettersObj[ l ] = ( lettersObj[ l ] || 0 ) + 1; if( letterNum > maxNumber ){ maxLetter = l; maxNumber = letterNum; }else if( letterNum === maxNumber ){ ( maxLetter instanceof Array) ? maxLetter.push( l ) : ( maxLetter = [ maxLetter, l ] ); } }); return maxLetter.toString(); }
使用 replace 添加函數參數形式的特性來替代人工的字母遍歷循環。當然由於考慮有相同最多次數字母情況,所以顯得比較繁瑣。如果還有較為巧妙的方法,歡迎學習交流~
原文作者:倪穎峰
原文博客:lovenyf.blog.chinaunix.net
