这是自己写的第一个程序,前几天帮忙做笔试,什么都不会,用一次次加一迭代完成,结果超时,这几天学习了一下数据结构,感觉很有收获,又尝试着写一写这个程序,忙活一下午才完成,不过还是很有成就感的,时间对比如下:
1000000 1000000
old:127928448,time:12.6369 new:127928448,time=0.0000
10000000000 10000000000
new:20478570792960,time=0.0001
可见时间复杂度优化还是henm很明显的哈哈!
问题:一个等式x+y=x|y(或运算),给出一个正整数x,满足等式的正整数y有很多个,从第一个开始由小到大数y,给定一个正整数k求第k个y。
输入样例:共t组测试用例
t
x1 k1
x2 k2
要求:2s内完成所有测试用例
实现如下:python3.6
import time
def tobin(a):
return bin(int(a))[2:][::-1]
def tonode(a):
if a=='0':
return [0,1,2]
else:
return [0,0,1]
def __init__(data_bin):
size=[]
node=[]
multi=[]
if data_bin[0]=='0':
node.append([0,1,2])
size.append(1)
multi.append(2)
else:
node.append([0,0,1])
size.append(0)
multi.append(1)
return size,node,multi
def twosearch(seq,size,i,node):
result='1'
i-=1
key=seq
while i>=0:
if size[i]==0:
result+='0'
i-=1
else:
if key>size[i]:
result+='1'
key-=size[i]
else:
result+='0'
i-=1
return int(result,2)
def fun_new(x,k):
i=1
data_bin=tobin(x)
data_len=len(data_bin)
size,node,multi=__init__(data_bin)
k=int(k)
if sum(size)>=k:
return 1
while 1:
if i<data_len:
node.append(tonode(data_bin[i]))
else:
node.append([0,1,2])
if node[i][1]==1:
size.append(multi[i-1])
multi.append(2*multi[i-1])
if sum(size)>=k:
break
else:
size.append(0)
multi.append(multi[i-1])
i+=1
seq=k-sum(size[:-1])
result=twosearch(seq,size,i,node)
return result
def fun_old(x,k):
k=int(k)#input
x=int(x)#input
y=0
for i in range(k):
y+=1
while x|y!=x+y:
y+=1
return y
if __name__ == '__main__':
t = int(input())
for i in range(t):
x,k = input().split()
# start_old = time.clock()
# result_old=fun_old(x,k)
# end_old=time.clock()
start_new = time.clock()
result_new=fun_new(x,k)
end_new=time.clock()
#print("old:%d,time:%.4f new:%d,time=%.4f" %(result_old,end_old-start_old,result_new,end_new-start_new))
print("new:%d,time=%.4f" %(result_new,end_new-start_new))