JS 統計一個字符串中出現次數最多字母


一個感覺很平凡的,常常在面試中出現的題目,擁有各種實現形式也就顯示出 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM