2022/8/27 京东笔试

1、构造题,1~n^2个数,构造一个n*n的矩阵使得矩阵任意相邻的数字相加都为奇数
n = int(input()) if n % 2 == 1: for i in range(1, n * n + 1, n): tmp = list(map(str, list(range(i, i + n)))) print(' '.join(tmp)) else: flag = 1 for i in range(1, n * n + 1, n): tmp = list(map(str, list(range(i, i + n)))) if flag % 2 == 0: tmp = tmp[1:] + [tmp[0]] print(' '.join(tmp)) flag += 1
2.给定一个数组a,求最少需要改动多少个元素,使得数组a类似于[a,b,a,b,...,]的形式,注意a不能等于b
n=int(input()) a=list(map(int,input().split())) buf=[dict() for i in range(2)] for i in range(n): buf[i&1][a[i]]=buf[i&1].get(a[i],0)+1 key=[list(buf[i].keys()) for i in range(2)] for i in range(2): key[i].sort(key=lambda x:buf[i][x],reverse=True) ans=n ans=min(ans,n-max(buf[0][key[0][0]],buf[1][key[1][0]])) if key[0][0]!=key[1][0]: ans=min(ans,n-buf[0][key[0][0]]-buf[1][key[1][0]]) else: if len(key[0])>1: ans=min(ans,n-buf[0][key[0][1]]-buf[1][key[1][0]]) if len(key[1])>1: ans = min(ans, n - buf[0][key[0][0]] - buf[1][key[1][1]]) print(ans)3.给定一个整数n,求长度为n的字符串中"red"作为子串出现次数大于等于2的字符串总数。
我是这样考虑的:正着做不好做,那就反着做,用所有字符串的数量减去不合法的字符串的数量
不合法的字符的字符串总共有三种情况:
0)完全不含"red"
1)只含有一个"red"
2) 第1种情况的补充,类似于这种形式:"...rreded...","...reredd..."
但是只过了20%...(草,只含有一个"red"的情况求错了)
n=int(input()) if n<6: print(0) else: mod=1000000007 dp=[[1]*26 for i in range(26)] one=0 two=0 if n-3<3: one=pow(26,n-3) if n-6<3: two=pow(26,n-6) for i in range(1,n-2+1): ndp=[[0]*26 for _ in range(26)] for j in range(26): for k in range(26): for x in range(26): if j==17 and k==4 and x==3: continue ndp[k][x]+=dp[j][k] ndp[k][x]%=mod dp=ndp if i+2==n-3: for j in range(26): for k in range(26): one=(one+dp[j][k])%mod if i+2==n-6: for j in range(26): for k in range(26): two=(one+dp[j][k])%mod zero=0 for i in range(26): for j in range(26): zero = (zero + dp[i][j]) % mod ans=pow(26,n,mod) ans=((ans-zero)%mod+mod)%mod ans=((ans-one*(n-2)%mod)%mod+mod)%mod ans=((ans-two*(n-5)*2%mod)%mod+mod)%mod print(ans)
贴个大佬的做法:
def solve(n): #f[i]表示长度为i且不含"red"的字符串数量 #g[i]表示长度为i且仅含1个"red"的字符串数量 mod = 1000000007 if n < 6: return 0 f = [0] * (n + 1) g = [0] * (n + 1) f[1] = 26 f[2] = 26 * 26 f[3] = 26 ** 3 - 1 g[3] = 1 for i in range(4, n + 1): f[i] = ((f[i - 1] * 26 - f[i - 3]) % mod + mod) % mod g[i] = ((g[i - 1] * 26 - g[i - 3] + f[i - 3]) % mod + mod) % mod return ((pow(26, n, mod) - f[i] - g[i]) % mod + mod) % mod n=int(input()) print(solve(n))