【问题标题】:Convert the input number to alphabet representation将输入数字转换为字母表示
【发布时间】:2018-04-26 03:23:37
【问题描述】:

我被要求在下面的程序中进行编码,并且已经进行了很好的编码。但无法模拟 0 案例考虑,我错过了哪里?下面是问题和代码:

让0代表'A',1代表'B',等等。给定一个数字序列,计算给定数字序列的可能解码次数。

输入:digits[] = "121" 输出:3(可能的解码是“BCB”、“BV”、“MB”) 同样,“200”可以解释为“caa”或“ua”,而“007”有一个。

我的代码:

def countValidSequences(input_num):

    n = len(input_num)
    number = list(input_num)

    occurance = [0] * (n+1) 
    occurance[0] = 1
    occurance[1] = 1

    for i in range(2, n+1):

        occurance[i] = 0

        if (number[i-1] > '0'):
            occurance[i] += occurance[i-1]

        if (number[i-2] < '2' or (number[i-2] <= '2' and number[i-1] < '6') ):
            occurance[i] += occurance[i-2]

    return occurance[n]



print("Count ",countValidSequences("200"))
print("Count ",countValidSequences("2563"))
print("Count ",countValidSequences("123"))
print("Count ",countValidSequences("99"))
print("Count ",countValidSequences("100200300"))

O/P:

Count  1
Count  2
Count  3
Count  1
Count  3

对于没有 0 的输入,它可以正常工作,知道我错过了什么吗?

【问题讨论】:

  • 如果0代表A,'121'不应该解码为'BCB'而不是'ABA'
  • 对不起,我的错误。更新
  • 我无法理解您对事件累加器的推理。您的预期输出是什么(尤其是“100200300”)?
  • IMO,应该是:BAACAADAA,KACAADAA,KAUADAA,BAAUADAA。因此 4 应该是输出。
  • 我只看了你的算法,但我确信也需要乘法。例如:200200 至少可以解释为 200 200,因为 200 可以解释为两种方式(20 0 或 2 0 0),所以 200200 至少可以解释为 2*2 = 4 种方式。

标签: python dynamic-programming


【解决方案1】:

我采用了递归方法,但如果需要,您可以将其转换为 back to iterative

我创建了一个名为 valid_two_digit_encoding 的函数。通过创建一个较小的命名函数,很容易测试它是否正常工作。在您的代码中,我不确定 if (number[i-2] &lt; '2' or (number[i-2] &lt;= '2' and number[i-1] &lt; '6') ) 应该做什么,您无法单独检查它是否有效。 '00' 满足该条件。这是你的本意吗?

结束条件是,如果只有 1 位,则只有一种编码。

如果两位数是有效的编码,我们需要添加所有其他可能的编码。此外,我们总是需要以一位数字版本开头的编码。

def valid_two_digit_encoding(a, b):
    if not a or not b:
        return False
    if a in ('1', '2') and b < '6':
        return True
    return False

def valid_sequences(input_num):
    if len(input_num) <= 1:
        return 1

    encodings = 0
    if valid_two_digit_encoding(input_num[0], input_num[1]):
        encodings += valid_sequences(input_num[2:])

    encodings += valid_sequences(input_num[1:])

    return encodings


def countValidSequences(input_num):
    return valid_sequences(input_num)

# Input "1" output 1
print("Count ",countValidSequences("1"))
# Input "121" output 3
print("Count ",countValidSequences("121"))
# Input "200" output 2
print("Count ",countValidSequences("200"))
# Input "007" output 1
print("Count ",countValidSequences("007"))
# Input "2563" output 2
print("Count ",countValidSequences("2563"))
# Input "123" output 3
print("Count ",countValidSequences("123"))
# Input "99" output 1
print("Count ",countValidSequences("99"))
# Input "100200300" output 4
print("Count ",countValidSequences("100200300"))
# Input "2222" output 5
print("Count ",countValidSequences("2222"))
# Input "312" output 2
print("Count ",countValidSequences("312"))

哪些输出:

Count  1
Count  3
Count  2
Count  1
Count  2
Count  3
Count  1
Count  4
Count  5
Count  2

【讨论】:

  • 谢谢@Zev,我一直在寻找代码中 0 位的附加逻辑,但您的代码也解决了问题。
  • 所以调用valid_sequences(input_num[1:])会处理数字从3开始的情况?
  • @CodeQuestor 谢谢,我尝试修改你的代码,但我不确定它的意图是什么,所以这就是我想出的。如果这有效,请接受它。如果您坚持修改现有代码,我建议您在代码中添加更多 cmets。
  • 您的回答绝对值得被接受的解决方案。同时,我会尝试改进我的代码。谢谢。
  • @CodeQuestor 是的,我在一个以 3 开头的案例中添加了
猜你喜欢
  • 1970-01-01
  • 2019-03-25
  • 2016-07-07
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
相关资源
最近更新 更多