emmmm,吸取了之前华为笔试一道题花时间太长的教训,这次给自己限定了每题最多半小时的限制
。。。于是一题都没AC _(:з」∠)_
完结了后没看答案试着把刚才的补补全,但没测例不知道对不对就是了。。。
第一题:
输入一个int列表,问通过+1将该列表变为非重复数字总共需要多少步:
印象里之前在LeetCode做过,但是半小时没做出来,直接下一题 5%
boxNums = int(input()) boxs = list(map(int, input().split(" ")))[:boxNums] boxs.sort() last = boxs[0] remant = 0 # 还没填充的重复数字 added = 0 for i in range(1, len(boxs)): if(last== boxs[i]): #与前面重复,多余数值+1 remant+= 1 elif remant>0: dist = boxs[i]-last if dist > 1: fill = dist-1 # 有多少坑位 if fill > remant : fill = remant remant-=fill step = 0 # 通过累加填充多余数值到坑里 for j in range(1, fill+1): step+=j added+= step pass added+=remant*dist # 增加剩余多余数字到当前值 last = boxs[i] pass step = 0 for j in range(1, remant+1): step+=j added +=step print(added)
结束又看了眼想起是个累加。。早知道多分配10分钟
第二题:
问给定的一组火柴能否拼成正方形,直接把非4的倍数和有火柴长度大于1/4的情况过滤掉也有一定分数(貌似50%,忘了)
# 回溯法凑边,凑不出边就是不能正方形 def makeSide(batch_li, used_set, target, index = -1, value = 0): if value > target: return False elif value == target: return True if value<= target: for i in range(index+1,len(batch_li)): if i not in used_set: print(i) value += batch_li[i] # 当前值 used_set.add(i) # 记录用了的火柴 if makeSide(batch_li,used_set,target,i,value): return True else: used_set.remove(i) # 弹出当前火柴 value -= batch_li[i] return False input_nums = int(input()) for i in range(0,input_nums): input_list = list(map(int, input().split(" "))) nums = [0] batchs = input_list[1:] batchs.reverse() sum_len = sum(batchs) print(sum_len) if(sum_len%4!=0): print("NO1") else: side = sum_len/4 if batchs[0]> side: print("NO2") else: used_set = set() for s in range(0,4): if not makeSide(batchs,used_set,side): print(s) print("NO3") break else: print("YES") pass
回溯法不是很熟,考完还是做了段时间。。。
第三题:
问斐波那契数列的第N项是否能被3整除,能则YES否则NO
强算先手拿了50%,然后观察了下前30个输出,发现其实有规律
为了观察规律测试了会,但最后不知道哪里规律没总结对,看看时间到了,下一题 50%
强算版:
input_nums = int(input()) for i in range(0,input_nums): a,b, n = map(int, input().split(" ")) if a%3==0 and b%3==0: print("YES") continue for i in range(1,n): cur = a+b a = b b = cur if b%3==0: print("YES") else: print("NO") pass
找规律版:
input_nums = int(input()) for i in range(0,input_nums): a,b, n = map(int, input().split(" ")) n+=3 if a%3==0 and b%3==0: print("YES") elif a%3==0: if n%4==3: print("YES") else: print("NO") elif b%3==0: if n%4==0: print("YES") else: print("NO") else: if n%4==2: print("YES") else: print("NO")
最后发现是n的起始点和强算版不太一样,考试时没发现应该是憋尿一个小时后注意力涣散了
第四题:
输入一个int列表,问连续子序列最大的gcd与子序列长度的和,
遇到点bug但最后时间来不及了,赶紧处理了下输入 10%
def gcd(a,b): if((a==0 )or( b==0)): return 0 elif (a==1) or (b==1): return 1 if b>a: a,b = b,a while(a!=b): a%=b if(a==1): return 1 elif(a==0): return b if b>a: a,b = b,a pass return b input_nums = int(input()) li = list(map(int, input().split(" "))) if(len(li)==0): print(0) elif(len(li)==1): print(li[0]) elif(len(li)==2): print(gcd(li[0],li[1])) max_gcd = 0 g = li[0] start = 0 for i in range(1, len(li)): g = gcd(g, li[i]) if g==1: g = li[i] start = i length = i- start +1 max_gcd = max(max_gcd, g*length) pass print(max_gcd)
检查了下BUG是gcd写错了,BUG没修多久但时间来不及也没办法,而且修好了这也不一定过啦233
全部评论
(5) 回帖