首頁  >  文章  >  web前端  >  JavaScript趣題:排列組合實戰

JavaScript趣題:排列組合實戰

黄舟
黄舟原創
2017-02-04 15:08:361348瀏覽

首先,來看這樣一張圖,它類似於以前老式平板手機的按鍵桌面。

JavaScript趣題:排列組合實戰

我們如果按了“2”這個鍵,那麼可以調出“A”,“B”,“C”三種字母來。
除了「1」和「0」鍵,其它數字鍵都可以調出多種字母來。
現在問題來了,我選擇四個任意數字鍵,可以得到多少種字母數字組合來?
比方說,我選擇了“0002”,因為“0”鍵沒有對應的字母,所以,它的組合只有三種——“000A”,“000B”,“000C”。
來個複雜點的例子,連續按“0023”,“0”保持不變,“2”可以對應“A”,“B”,“C”,“3”可以對應“D”,“E” ,“F”,那麼,按照排列組合的知識,應該有1*1*3*3=9種組合方式。
好,那咋們來看怎麼解決這個問題。
第一步,根據數字鍵和對應字母的關係建立映射。

var map = {  
    1 : [ 1 ],  
    2 : [ "A", "B", "C" ],  
    3 : [ "D", "E", "F" ],  
    4 : [ "G", "H", "I" ],  
    5 : [ "J", "K", "L" ],  
    6 : [ "M", "N", "O" ],  
    7 : [ "P", "Q", "R", "S" ],  
    8 : [ "T", "U", "V" ],  
    9 : [ "W", "X", "Y", "Z" ],  
    0 : [ 0 ]  
};

第二步,使用遞歸求解排列組合

function telephoneWords(digitString) {  
    var array = [];  
    var result = [];  
    digitString.split("").forEach(function(e) {  
        array.push(map[e]);  
    })  
    var traverse = function foo(from, to) {  
        if (to.length < 4) {  
            var cur = from.shift();  
            for (var i = 0; i < cur.length; i++) {  
                var newTo = to.slice(0);  
                newTo.push(cur[i]);  
                var newFrom = from.slice(0);  
                foo(newFrom, newTo);  
            }  
        } else {  
            result.push(to.join(""));  
        }  
    };  
    traverse(array, []);  
    return result;  
}

以上就是 JavaScript趣題:排列組合實戰的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn