1

给定一个数字,将其翻译成所有可能的对应字母组合。例如,如果给定数字1234,它应该吐出abcd, lcd, ,awd因为与字母对应的数字组合可能是1 2 3 4, 12 3 4, 或1 23 4

我当时正在考虑用 Python 做这件事的方法,老实说,我被难住了。有什么提示吗?

到目前为止,我基本上只设置了一个简单的系统来将单个数字转换为字母。

4

2 回答 2

1

制作str.

这里一样实现分区

过滤数量超过 26 的列表。

编写返回字母的函数。

def alphabet(n):
    # return " abcde..."[n]
    return chr(n + 96)


def partition(lst):
    for i in range(1, len(lst)):
        for r in partition(lst[i:]):
            yield [lst[:i]] + r
    yield [lst]


def int2words(x):
    for lst in partition(str(x)):
        ints = [int(i) for i in lst]
        if all(i <= 26 for i in ints):
            yield "".join(alphabet(i) for i in ints)


x = 12121
print(list(int2words(x)))
# ['ababa', 'abau', 'abla', 'auba', 'auu', 'laba', 'lau', 'lla']
于 2015-09-23T09:50:21.063 回答
0

我不会给你一个完整的解决方案,而是一个从哪里开始的想法:

我会将数字转换为字符串并遍历字符串,因为字母表有 26 个字符,您只需检查一位和两位数字。

正如在上面的评论中,递归方法可以解决问题,例如:

号码是 1234

*) 取第一个字符 -> 数字为 1

*) 从那里将它与所有剩余的 1 位数字结合起来 -->

      1 2 3 4

*) 然后将其与下一个 2 位数字(如果 <= 26)和剩余的 1 位数字结合起来 -->

      1 23 4

*) ...等等

正如我所说,这只是一个从哪里开始的想法,但基本上它是一种使用组合数学的递归方法,包括检查两位数是否不大于 26 从而超出字母表。

于 2015-09-23T07:52:43.927 回答