当"如果nums中的任意两个数字加起来达到目标,则函数应返回True。否则,返回False">
非常感谢你的帮助!
random.seed(a=13, version=2)
random_numbers = random.sample(range(1000000),k=10000) # generate 10,000 random numbers in [1, 1,000,000)
def pair_exists(nums, target):
for i in nums:
for j in nums:
if i != j and i + j == target:
print (i,j)
return True
elif i+j != target:
print (i,j)
return False
print(pair_exists(random_numbers, 38109)) # SHOULD RETURN TRUE
print(pair_exists(random_numbers, 13538)) # SHOULD RETURN FALSE
我得到了的结果
271590 271590
False
271590 271590
False
正如@AChampion的评论中所提到的,这个
elif i+j != target:
print (i,j)
return False
将在出现第一个错误结果时退出函数。删除return False
以继续搜索,最后只删除return False
。
您的算法可以工作,就像AChampions itertools.combination方法一样,但使用一组所有数字,如果它们满足条件,则检查一半的数字
(targetnumber - aktualnumber) in all_numbers
更快:
import random
random.seed(a=13, version=2)
random_numbers = random.sample(range(1,1000001), k=10000) # fix numbers
def pair_exists(nums, target):
first_half = nums[:len(nums)//2] # even number of elements in nums
all_nums = set(nums) # use a set for speed reasons
for num in first_half:
if target - num in all_nums and target - num != num:
print(num, target - num)
return True
return False
print(pair_exists(random_numbers, 38109)) # True for me
print(pair_exists(random_numbers, 2)) # always False
根据种子的不同,较高的数字可能是也可能不是True
,而2
永远不可能是真的,因为范围为1…1000000,最小的两个数字加起来为3。
性能测量:
With sets
0.0125215
0.0157244
With for loops
51.583881399999996
170.0219317
With itertools
57.5434453
100.71193929999998
要复制的代码:
import random
from itertools import combinations
def pair_exists(nums, target):
first_half = nums[:len(nums)//2] # even number of elements in nums
all_nums = set(nums) # use a set for speed reasons
for num in first_half:
if target - num in all_nums and target - num != num:
# print(num, target - num)
return True
return False
def pair_exists_itertools(nums, target):
for i, j in combinations(nums, r=2):
if i != j and i + j == target:
# print (i,j)
return True
return False
def pair_exists_forloops(nums, target):
for i in nums:
for j in nums:
if i != j and i + j == target:
# print (i,j)
return True
return False
random.seed(a=13, version=2)
random_numbers = random.sample(range(1,1000001), k=10000) # fix numbers
from timeit import timeit
def test_em(w, f):
n = 10 # repeat only for 10 times to average measurements
print("With ", w)
print(timeit(lambda: f(random_numbers, 38109), number=n))
print(timeit(lambda: f(random_numbers, 2), number=n))
for what, func in ( ("sets", pair_exists),
("for loops", pair_exists_forloops),
("itertools", pair_exists_itertools)):
test_em(what, func)
在您编写此的地方
random.sample(范围(1000000(,k=10000(#在[11000000(中生成10000个随机数
尝试将代码更改为随机。sample(范围(1000000(,k=10000(