【发布时间】: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
我们已阅读:
【问题讨论】: