顺丰笔试
太难了
幸运数一眼没思路,骗了点分;
排列感觉是二分,试了一下确实,一直超时是63%,开始以为是计算math.log2耗时,后来发现只要循环n次必超时,O(n)都不行,最后想到用数组提前保存一下同一个对数结果对应的数字区间,计算好每个区间内数字个数终于100%了...
n = 5
count = 0
list = [0]*31
for i in range(1,len(list)):
# list[i] 代表2**i 2**(i-1)有多少个元素
list[i] = 2**i-2**(i-1)
cur = int(math.log2(n))+1
for i in range(1,cur):
count += list[i]*i # 元素个数*每个元素log结果
count += cur*(n-2**(cur-1)+1)
print(count)
#顺丰科技##顺丰科技笔试#count = 0
list = [0]*31
for i in range(1,len(list)):
# list[i] 代表2**i 2**(i-1)有多少个元素
list[i] = 2**i-2**(i-1)
cur = int(math.log2(n))+1
for i in range(1,cur):
count += list[i]*i # 元素个数*每个元素log结果
count += cur*(n-2**(cur-1)+1)
print(count)