第1关:二分查找算法
本关任务:编写一个实现二分算法的函数,能在一个已排序列表中快速搜索指定的数。
#二分查找
def binary_search(A, x):
########## begin ##########
# 请在此填写代码,找到x返回索引号,没找到返回-1
low,high=0,len(A)-1
while high>=low:
mid=(high+low)//2
if A[mid]==x:
return mid
elif A[mid]>x:
high=mid-1
else:
low=mid+1
return -1
########## end ##########
import random
random.seed(177) #随机数种子,使得A里面的数固定
#在1到百万的范围内,生成1万个数字
A=[random.randint(1,1000000) for i in range(10000)]
A.sort()
x=int(input())
index=binary_search(A, x)
print(index)
第2关:二分法查找平方和
本关任务:编写一个程序,用来在一个数字列表中搜索2个数a和b,使得a2+b2=x,其中x为一个给定的数。
平台生成一个包含1万个元素的列表(里面的元素每次运行时都一样),输入是一个数字x,要求函数在列表中找到2个数a,和b,使得a和b的平方和等于x,如果找到了,输出a和b(中间用空格隔开,要求a<=b,若有多对可能的a和b,输出其中a最小的一对),如果没有找到,返回-1。要求运行时间小于1秒。
# -*- coding: utf-8 -*-
import random,math
#二分查找
def binary_search(A, x):
########## begin ##########
# 请在此填写代码,找到x返回索引号,没找到返回-1
low,high=0,len(A)-1
while high>=low:
mid=(high+low)//2
if A[mid]==x:
return mid
elif A[mid]>x:
high=mid-1
else:
low=mid+1
return -1
########## end ##########
random.seed(17) #随机数种子,使得A里面的数固定
#在1到1千的范围内,生成1万个数字
A=[random.randint(1,1000) for i in range(10000)]
A.sort() #排序
X=int(input())
founded=False
for i, a in enumerate(A[:-1]):#遍历前n-1个数
########## begin ##########
# 请在此填写代码,输出找到的a和b,没找到返回-1
if X-a**2>=0:
b=math.sqrt(X-a**2)
idx=binary_search(A[i+1:], b)
if idx!=-1:
founded=True
print(a,A[i+1+idx])
break
########## end ##########
if not founded:print('-1')
求求三连。。。