9.20B站笔试
3个编程。
1. 每次可以选取一些数字-2**k,k每次+1,如果选取的数字个数不为0则为一次有效操作。问将数组中的数都减小到非负一共多少次有效操作。
思路:这不就是直接实现么感觉不难,但是之过了5%。。。就排序然后用指针遍历每次判断小于2**(k+1)就移动指针。。。无解,求大佬帮看。
def output(n, arr): res = 0 arr.sort() k = 0 i = 0 while i < n: if arr[i] == 1: i+=1 else: break if i != 0: res+=1 k+=1 while i < n: j = i while j < n and arr[j] <= 2 ** (k+1): j += 1 num = j - i if num != 0: res += 1 k += 1 i = j return res2. 数组每个元素为对应商品价值,输出的数组对应元素为为这个商品之前买的商品且价格大于当前商品的最大的index。
思路:暴力遍历然后内层倒着遍历就AC。
def output(n,arr): res = [] dic = {} for i in range(n): dic[i] = arr[i] if i == 0: res.append("INF") else: idx = -1 for j in range(i-1,-1,-1): if dic[j] > arr[i]: idx = j break if idx == -1: res.append("INF") else: res.append(str(dic[idx])) return res
3. 一个字符串形如(x-1)(x+5)问求最终x的系数是多少。
思路:遍历过程中维护两个变量,一个是乘积一个是结果,结果每次用上一个乘积加当前的num即可。感觉思路没有问题但是只过了20%。。。
string = input().strip() n = len(string) if n == 5: print(1) else: mul,res = 0,0 for i in range(0,n,5): seg = string[i:i+5] num = int(seg[2:4]) if i == 0: mul = num else: res = (num + mul)%10007 mul = (num * mul)%10007 print(res%10007)