def dbl_linear(n):
integers = [1]
for k in range(71100):
integers.extend([integers[k]*2+1, integers[k] * 3 + 1])
a = list(set(integers))
a.sort()
return a[n]
我在代码战中找到了这项任务,但无法解决 我的函数返回不同的结果这取决于范围内的数字 如果我在范围60001中写入并返回list [60000],并且如果我在范围100000中写入并返回list [60000],则它们是不同的 为什么?
答案 0 :(得分:0)
您生成的数字不是严格排序的。每增加k
,列表中就会增加两个个整数,这些整数不一定大于之前添加的数字。
您已经在k = 2
上看到了这一点:
k = 0
,integers[0]
是1
,因此循环将添加1 * 2 + 1
和1 * 3 + 1
== 3, 4
。k = 1
采用integers[1]
== 3
,因此将7, 10
添加到列表中。k = 2
采用integers[2]
== 4
,因此将9, 13
添加到列表中。 9
比10
随着您反复添加更多值,此操作将继续。对于10001
次重复,循环显然会添加至少一个值,该值小于您仅重复60000
次循环时被排序到索引60001
的值
实际上有3001个这样的值:
>>> upto60k = [1]
>>> for k in range(60001):
... upto60k += upto60k[k] * 2 + 1, upto60k[k] * 3 + 1
...
>>> upto100k = [1]
>>> for k in range(100001):
... upto100k += upto100k[k] * 2 + 1, upto100k[k] * 3 + 1
...
>>> added = sorted(set(upto100k).difference(upto60k))
>>> len(added)
68046
>>> sorted(set(upto60k))[60000]
1726840
>>> from bisect import bisect_left
>>> bisect_left(added, 1726840) # index of first value > 1726840
3001
因此,较长循环中添加到integers
的额外值中的3001小于1726840
,并将在该值之前排序;因此您会在索引63001的10万次重复设置中找到相同的1726840
值:
>>> sorted(set(upto100k))[63001]
1726840