【发布时间】:2018-01-10 04:37:54
【问题描述】:
我正在为下一次面试学习算法,我发现了这个问题。
Facebook 提出的问题
这就是问题所在。
给定映射 a = 1, b = 2, ... z = 26 和编码消息,计算可以解码的方式数。
例如,消息“111”会给出 3,因为它可以被解码为“aaa”、“ka”和“ak”。
我想我可以处理映射并转换为字母部分。但是组合对我来说并不容易。
考虑到我花了几个小时才想出下面的代码。
function combinations(str) {
var fn = function(active, rest, a) {
// if nothing, just return
if (!active && !rest)
return;
// there is nothing left in rest add active to A
if (rest.length == 0) {
a.push(active);
} else {
// append first number of rest to the end of the active item
// [1] + 1 => 111
// [1,2] + [3,4] = [1,2,3] + [4]
if (rest.length > 0){
fn(active.concat(rest[0]), rest.slice(1), a);
}else {}
// join
fn((active+rest[0]).split(","), rest.slice(1), a);
}
return a;
}
return fn([], str, []);
}
// run it
combinations(1,2,3);
我只有这个。
[ [ 1, 2, 3 ],
[ '1', '23' ],
[ '12', 3 ],
[ '123' ],
[ '1', 2, 3 ],
[ '1', '23' ],
[ '12', 3 ],
[ '123' ] ]
查看重复项。我想我现在可以除以 2 并得到我想要的答案。仍然不是一个很好的答案。
你能把它变成更好的代码吗?
谢谢
上面的代码几乎来自这个link
【问题讨论】:
-
如果它的字符解码,你怎么会有
123? -
由于 OP 正在寻找算法而不是 JS 特定的实现,因此不应考虑不同的语言(JS vs Java in dupe)。
-
没错@Rajesh 这个post 有其他语言的这个问题的答案。 (我只是更喜欢js,这就是我的工作。)如果你愿意,你可以查看下面答案的js版本。
标签: javascript algorithm combinations alphabet