8.20 网易笔试 算法岗

以为刷了1000题,秋招笔试应该AK很轻松了 结果今天考了两场都没A掉,上午卡python的. 太难了

Q1 100%

贪心从左到右转换,题目意思是相邻的数换位置。

n = int(input())
*nums, = map(int, input().split())

hm = dict()
for i in range(n):
    hm[nums[i]] = i
res = []
acc = 0
for i in range(n):
    while nums[i] != i + 1:
        acc += 1
        idx2 = hm[nums[i] - 1]
        nums[i], nums[idx2] = nums[idx2], nums[i]
        hm[nums[idx2]] = idx2 
        hm[nums[i]] = i 
        res.append([idx2, i])
print(acc)
for i in range(len(res)):
    print(res[i][0], res[i][1])

Q2 100%

哈希加前缀和

s = input().strip()
from collections import defaultdict 
hm = defaultdict(int)
hm['0,0,0'] = 1
r = e = d = 0
res = 0
for i in range(len(s)):
    if s[i] == 'r':
        r += 1
    if s[i] == 'e':
        e += 1
    if s[i] == 'd':
        d += 1
    state = f'{0},{e-r},{d-r}'
    res += hm[state]
    hm[state] += 1
print(res)

Q3 100%

看到位运算,基本上都是把每一位拆开了看,横看成岭侧成峰

n, k = map(int, input().split())
*nums, = map(int, input().split())

cnt = [[0] * 30 for _ in range(n)]

for i in range(n):
    tmp = nums[i]
    idx = -1
    while tmp:
        if tmp & 1:
            cnt[i][idx] += 1
        tmp = tmp >> 1
        idx -= 1
final = [0] * 30 
exclude = set()
for i in range(30):
    tmp = 0
    s = set()
    for j in range(n):
        if j in exclude:
            continue 
        if cnt[j][i] == 1:
            tmp += 1
        else:
            s.add(j)
    if tmp >= k:
        final[i] = 1 
        exclude = exclude | s     

print(int(''.join(map(str,final)), 2))

Q4 60%

参考斐波那契数列logn做法,但是我不知道怎么算 mod k,其中n应该是不能mod,不然会影响结果,有没有A了的大佬说说怎么做

mod = 10 ** 9 + 7
def matmul(A, B):
    res = [[0] * 2  for _ in range(2)]
    for i in range(2):
        for j in range(2):
            for k in range(2):
                res[i][j] += A[i][k] * B[k][j]
                res[i][j] %= mod
    return res 

def quickpowmat(A, n):
    mul = [[1,0],[0,1]]
    base = A
    while n:
        if n & 1:
            mul = matmul(mul, base)
        base = matmul(base, base)
        n = n >> 1
    return mul 

def quickpow(a, n):
    mul = 1
    base = a
    while n:
        if n & 1:
            mul *= base
            mul %= mod
        base = base * base
        base %= mod
        n = n >> 1
    return mul    

a, b, n = map(int, input().split())
def solve1(a,b,n):
    if n == 1:
        return a % mod
    elif n == 2:
        return b % mod
    A = [[2,2],[1,0]]
    init = [[0,1],[1,0]]
    trans = quickpowmat(A, n - 2)
    final = matmul(trans,init)
    a0, b0 = final[0]
    res = quickpow(a,a0) * quickpow(b,b0)
    res %= mod
    return res 
print(solve1(a,b,n))
#网易笔试##秋招笔试#
全部评论
第四题,欧拉降幂,是不能mod p,可以mod phi(p),phi是欧拉函数,但要注意欧拉降幂有两种情况,根据指数的大小和phi(p)的关系。
1 回复 分享
发布于 2022-08-20 18:02 四川
谢谢大佬提供思路!
1 回复 分享
发布于 2022-08-20 18:47 浙江
费马小定理,模数是质数,幂直接mod p-1就行
1 回复 分享
发布于 2022-08-20 21:55 北京
感谢大佬,太强了!!!
点赞 回复 分享
发布于 2022-08-20 21:05 江苏
太强了吧  我曹
点赞 回复 分享
发布于 2022-08-20 21:39 浙江
大佬,请问好’e‘那题的思路是啥?可以具体讲讲“哈希加前缀和”嘛?因为我对只JS比较熟,所以看你的代码有点难度
点赞 回复 分享
发布于 2022-08-27 21:36 江苏
大佬,第三题int有符号类型不应该有31位是有值的吗,为什么只设置30
点赞 回复 分享
发布于 2022-09-11 21:16 北京
大佬,如果要改进第四题的话,是不是只需要在计算quickpowmat之前,把矩阵的指数用欧拉函数降幂就可以了
点赞 回复 分享
发布于 2022-09-12 22:43 北京

相关推荐

10-15 09:13
已编辑
天津大学 soc前端设计
点赞 评论 收藏
分享
7 32 评论
分享
牛客网
牛客企业服务