JavaScript趣题:排列组合实战
2016-10-12 13:36
417 查看
首先,来看这样一张图,它类似于以前老式平板手机的按键桌面。
我们如果按了“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 ]
};
第二步,使用递归求解排列组合
我们如果按了“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趣题:弹力球
- JavaScript趣题:迷路的牛仔
- JavaScript趣题:芳香剂蒸发器
- JavaScript趣题:Tribonacci数列
- JavaScript趣题:找出凶手
- JavaScript趣题:最小公分母
- JavaScript趣题:从URL中提取域名
- JavaScript趣题:深度比较对象
- JavaScript趣题:得到了奖金嘛?
- JavaScript趣题:哪些在里面?
- JavaScript趣题:求数组出现频率最大元素
- JavaScript趣题:成双成对的括弧
- JavaScript趣题:循环计数器
- 训练趣题:黑与白 有A、B、C、D、E五人,每人额头上都帖了一张黑或白的纸。(此处用javascript实现)
- javascript趣题(高人若知道script有什么奇怪的用法或令人费解的地方,务必留下片言碎语,不胜感激!)
- JavaScript趣题:回文质数
- JavaScript趣题:波浪形排序
- JavaScript趣题:形参和实参的映射
- JavaScript趣题:依赖注入
- JavaScript趣题:字符串排序