【问题标题】:Convert a long number to corresponding letter combinations将长数字转换为对应的字母组合
【发布时间】:2023-03-24 11:45:01
【问题描述】:

给定一个数字,将其翻译成所有可能的对应字母组合。例如,如果给定数字1234,它应该输出abcdlcdawd,因为与字母对应的数字组合可能是1 2 3 412 3 41 23 4

我在想如何用 Python 做到这一点,老实说,我被难住了。有什么提示吗?

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

【问题讨论】:

  • 你有没有尝试自己做任何事情?你能把你写的代码贴出来吗?
  • 一个基本的递归方法应该可以轻松解决这个问题...

标签: python letters-and-numbers


【解决方案1】:

制作str

here 一样实现partition

过滤数量超过 26 的列表。

Write 函数返回字母。

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']

【讨论】:

    【解决方案2】:

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

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

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

    数字是 1234

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

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

          1 2 3 4
    

    *) 然后将其与下一个 2 位数字(如果

          1 23 4
    

    *) ...等等

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

    【讨论】:

    • 不知道谁对你投了反对票,但他应该感到羞耻。投赞成票。
    • 肯定是那些寻找完整实现的人之一,但这不是它的本意:-D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2015-01-24
    • 2016-07-07
    • 1970-01-01
    相关资源
    最近更新 更多