线路布置问题.(有人能提出一个更节省时间的解决方案吗?)



从1开始的正整数排列成行。第i行有i个数字。例如前四行:

1 | 2, 3 | 4, 5, 6 |7, 8, 9, 10

编写一个函数,该函数接受参数";L";并且返回该布置的第L行。


这是我的方法:

def find_line(l):
array = []
x = 1
for i in range(1, l + 1):
while len(array) != I:
array.append(x)
x += 1 
if i == l:
return array
else:
array = []

您不需要循环。你可以直接计算出组中的第一个数字,方法是用取级数的和

start =  1 + (n * (n + 1)) // 2

如果你想让n从1而不是0开始,你需要从n中减去

def group(n):
n -= 1
start =  1 + (n * (n + 1)) // 2
return list(range(start, start + n +1))
# try it on first 10 numbers: 
for i in range(1, 10):
print(group(i))

这将打印:

[1]
[2, 3]
[4, 5, 6]
[7, 8, 9, 10]
[11, 12, 13, 14, 15]
[16, 17, 18, 19, 20, 21]
[22, 23, 24, 25, 26, 27, 28]
[29, 30, 31, 32, 33, 34, 35, 36]
[37, 38, 39, 40, 41, 42, 43, 44, 45]

如果需要字符串,可以使用join或类似的方法。

好吧,我想展示它背后的数学。让我们计算一个行号n的最后一项的表达式。

1 |   2  |    3    |      4     | .....line numbers
--+------+---------+------------+------
1 | 2, 3 | 4, 5, 6 | 7, 8, 9, 10| .....values

对于n=1(即行号1(,last=1所以last(1(=1
现在假设last(n)表示第n行的最后一个值,那么:-
last(n) = last(n-1) + n
例如,对于第4行,n=4,我们有
last(4) = last(3) + 4 = 6 + 4因此,展开复发,我们有:-

last(n) = last(n-1) + n
= (last(n-2) + n-1) + n
= last(1) + 2 + 3 + ....+ n-1 + n
= 1 + 2 + 3 + ....+ n-1 + n
= n*(n+1)/2
Thus, 
last(n) = n*(n+1)/2

由于第n行中有n个值,因此我们可以将第n行的起始值设置为:-

start(n) = last(n) - n + 1
OR
start(n) = n*(n-1)/2 + 1

或者,您也可以将start(n(设置为:-

start(n) = start(n-1) + n-1
= start(n-2) + n-2 + n-1
= start(1) + 1 + 2 + 3 + ....+ n-2 + n-1
= 1 + (1 + 2 + 3 + ... + n-2 + n-1)
= 1 + (n-1)*n/2
start(n) = n*(n-1)/2 + 1

休息你可以运行一个循环

loop from i=0 to i=n-1 :
print( start(n) + i )
def find_line(l):
starting_num = 1
res = []
for count in range (l):
starting_num += count
res = list(range(starting_num, starting_num+l))
return res

测试l=5:的功能

print(find_line(5))
[11, 12, 13, 14, 15]

相关内容

最新更新