【问题标题】:Generate number not in array生成不在数组中的数字
【发布时间】:2020-03-18 19:33:01
【问题描述】:

您好,我正在做以下编程练习:Squad number generator。声明是:

在每个赛季开始时,足球队中的每个球员都是 分配了自己独特的小队编号。由于迷信或他们的 历史上某些数字比其他数字更受欢迎。

编写一个函数 generateNumber() 接受两个参数,一个数组 当前小队号码(小队)和新球员的期望 编号 (n)。如果新玩家想要的号码尚未被占用, 返回 n,否则如果可以通过添加两个来形成所需的数字 1 到 9 之间的数字,返回将这两个数字连接起来的数字 数字在一起。例如。如果取 2,则返回 11,因为 1 + 1 = 2。 否则返回null。

注意:通常会有几种不同的方式来形成替代品 数字。在这些情况下,第一个数字最低的数字应该是 给予优先权。例如。如果 n = 15,但小队已经包含 15,则返回 69,而不是 78。

我们想了解如何改进以下算法:

def generate_number(squad, n): #☘️
    print("squad: ",squad)
    print("n: ",n)
    if n not in squad: return n
    firstDigit = n%9
    secondDigit = 9
    squadNumber = int(str(firstDigit)+str(secondDigit))
    while squadNumber <= 99 and squadNumber in squad:
        print("squadNumber: ",squadNumber)
        firstDigit+=1
        secondDigit-=1
        while(firstDigit+secondDigit != n):
            print("inside squadNumber: ",squadNumber)
            firstDigit+=1
            secondDigit-=1
            squadNumber = int(str(firstDigit)+str(secondDigit))
        squadNumber = int(str(firstDigit)+str(secondDigit))
    return squadNumber if squadNumber <= 99 else None

问题是:我们如何得到求和为 n 的两位数组合?

例如:

n = 11 -> 11%9 = 2 -> 2+9 = 11 -> 29
n = 16 -> 16%9 = 7 -> 7+9 = 16 -> 79
n = 10 -> 10%9 = 1 -> 1+9 = 10 -> 19

但是,如果 n 为 18 并且它目前正在小队中,会发生什么情况。该算法应返回下一个最低值,即 99...

但是我们的代码的踪迹是:

squad:  [1, 2, 3, 4, 6, 9, 10, 11, 15, 18, 23, 69]
n:  18
squadNumber:  9
inside squadNumber:  9
inside squadNumber:  27
inside squadNumber:  36
inside squadNumber:  45
inside squadNumber:  54
inside squadNumber:  63
inside squadNumber:  72
inside squadNumber:  81
inside squadNumber:  90

Traceback (most recent call last):
  File "main.py", line 23, in <module>
    Test.assert_equals(generate_number([1, 2, 3, 4, 6, 9, 10, 11, 15, 18, 23, 69], 18), 99)
  File "/home/codewarrior/solution.py", line 16, in generate_number
    squadNumber = int(str(firstDigit)+str(secondDigit))
ValueError: invalid literal for int() with base 10: '10-1'

所以下面的测试会失败:

Test.it("should return next lowest, two-digit combination, if n is already taken")

Test.assert_equals(generate_number([1, 2, 3, 4, 6, 9, 10, 11, 15, 18, 23, 69], 18), 99)

我们想到了直接的方法:从 11 循环到 99 并返回数字和 n 的最低值:

def generate_number(squad, n):
    print("squad: ",squad)
    print("n: ",n)
    if n not in squad: return n
    for twoDigitsNumber in list(range(11,100)):
        if "0" in str(twoDigitsNumber): continue
        print("twoDigitsNumber: ",twoDigitsNumber)
        firstDigit=int(str(twoDigitsNumber)[0])
        secondDigit=int(str(twoDigitsNumber)[1])
        summed=firstDigit+secondDigit
        print("summed: ",summed)
        if twoDigitsNumber not in squad and summed==n: return twoDigitsNumber
    return None

我们已阅读:

【问题讨论】:

    标签: python algorithm numbers


    【解决方案1】:

    你的计算有问题。看看你的踪迹:

    n:  18
    squadNumber:  9
    inside squadNumber:  9
    inside squadNumber:  27
    

    你没有找到99,因为你决定用它的数字总和来替换你想要的小队号码;这与规格相反。您应该搜索 18 的总和,而不是 9。从您的代码中删除该替换,它应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 1970-01-01
      • 2019-08-11
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 2012-04-26
      • 1970-01-01
      相关资源
      最近更新 更多