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 res
2. 数组每个元素为对应商品价值,输出的数组对应元素为为这个商品之前买的商品且价格大于当前商品的最大的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)




#b站笔试##B站#
全部评论
第一题所有数在一起求位或,计算这个值二进制里1的个数
点赞 回复 分享
发布于 2022-09-20 20:42 湖北
第一题位运算 ,第二题单调栈解决下一个更大元素,第三题维护一个数组所有元素的products,每次用products 除以当前遍历元素
点赞 回复 分享
发布于 2022-09-20 21:15 浙江

相关推荐

服从性笔试吗,发这么多笔,现在还在发。
蟑螂恶霸zZ:傻 x 公司,发两次笔试,两次部门匹配挂,
投递金山WPS等公司10个岗位 >
点赞 评论 收藏
分享
11-03 14:38
重庆大学 Java
AAA求offer教程:我手都抬起来了又揣裤兜了
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务