欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

JavaScript趣题:排列组合实战

程序员文章站 2022-03-10 10:18:01
...
首先,来看这样一张图,它类似于以前老式平板手机的按键桌面。

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)!