第一题

2021_04_05_13_27_Office_Lens_(1).jpg

题解:和 LeetCode64. 最小路径和 类似的递归。用两个数组,一个储存正的最大值,另一个储存负的最大值即可。

  1. grid = [
  2. [-1, 3, 1],
  3. [1, 5, 1],
  4. [4, 2, 1]
  5. ]
  6. INF=10**9
  7. MOD=10**9+7
  8. m = len(grid)
  9. n = len(grid[0])
  10. P = [[-INF]*n for _ in range(m)]
  11. N = [[INF]*n for _ in range(m)]
  12. P[0][0] = grid[0][0]
  13. N[0][0] = grid[0][0]
  14. for i in range(m):
  15. for j in range(n):
  16. if i:
  17. if grid[i][j] >= 0:
  18. P[i][j] = grid[i][j]*P[i-1][j]
  19. N[i][j] = grid[i][j]*N[i-1][j]
  20. else:
  21. P[i][j] = grid[i][j]*N[i-1][j]
  22. N[i][j] = grid[i][j]*P[i-1][j]
  23. if j:
  24. if grid[i][j] >= 0:
  25. P[i][j] = max(grid[i][j]*P[i][j-1], P[i][j])
  26. N[i][j] = min(grid[i][j]*N[i][j-1], N[i][j])
  27. else:
  28. P[i][j] = max(grid[i][j]*N[i][j-1], P[i][j])
  29. N[i][j] = min(grid[i][j]*P[i][j-1], N[i][j])
  30. print(P[m][n])

第二题

2021_04_05_13_27_Office_Lens_(2).jpg
题解:
腾讯笔试题 - 图3%20%5Cleft(%20a%5E2%2Bb%5E2%2Bab%20%5Cright)%C2%A0%0A#card=math&code=a%5E3-b%5E3%3D%5Cleft%28%20a-b%20%5Cright%29%20%5Cleft%28%20a%5E2%2Bb%5E2%2Bab%20%5Cright%29%C2%A0%0A)

腾讯笔试题 - 图4

如果直接计算的话,由于两个数之间的误差很小,会导致累积误差非常大,因此可以转化之后将 腾讯笔试题 - 图5 提取出来。

  1. l = 1
  2. r = 100
  3. k = 15
  4. ret = 0
  5. for i in range(l, r+1):
  6. ret += pow(i+pow(10, -k), 1/3)-pow(i, 1/3)
  7. print(ret)
  8. ret = 0
  9. pk = pow(10, -k)
  10. for i in range(l, r+1):
  11. s = pow(i+pk, 2/3)+pow(i, 2/3)+pow((i+pk)*i, 1/3)
  12. ret += 1/s
  13. ret *= pk
  14. print(ret)
  15. ret = 0
  16. for i in range(l, r+1):
  17. ret += 1/(3*pow(i, 2/3))
  18. ret *= pow(10, -k)
  19. print(ret)

三种方法的输出分别为:

  1. 2.886579864025407e-15
  2. 3.833455974119704e-15
  3. 3.833455974119704e-15

第三题

2021_04_05_13_27_Office_Lens_(3).jpg

题解:

F[n] 来记录从第1个小球一直摆到第 n 个小球一共有多少种方法。

容易列出状态转移方程:

腾讯笔试题 - 图7%20%2BF%5Cleft%5B%20n-2%20%5Cright%5D%20*%5Cleft(%20k-1%20%5Cright)%C2%A0%0A#card=math&code=F%5Cleft%5B%20n%20%5Cright%5D%20%3DF%5Cleft%5B%20n-1%20%5Cright%5D%20%2A%5Cleft%28%20k-1%20%5Cright%29%20%2BF%5Cleft%5B%20n-2%20%5Cright%5D%20%2A%5Cleft%28%20k-1%20%5Cright%29%C2%A0%0A)

该方程分为两个部分考虑:对于最后三个小球 [n-2] [n-1] [n]

  1. 最后两个小球[n-1] [n] 的颜色不同,此时只需 [n] 的颜色与 [n-1] 不同即可,方案数有 F[n-1]*(k-1) 种。
  2. 最后两个小球[n-1] [n] 的颜色相同,此时只需 [n-1] [n] 的颜色与 [n-2] 不同即可,方案数有 F[n-2]*(k-1) 种。

此时方程可以继续化简:
腾讯笔试题 - 图8%20%5E%7Bn-2%7D#card=math&code=f%5Cleft%5B%201%20%5Cright%5D%20%3Dk%0A%5C%5C%0Af%5Cleft%5B%202%20%5Cright%5D%20%3Dk%5E2%0A%5C%5C%0Af%5Cleft%5B%20n%20%5Cright%5D%20%3Df%5Cleft%5B%20n-1%20%5Cright%5D%20%2Bf%5Cleft%5B%20n-2%20%5Cright%5D%20%0A%5C%5C%0AF%5Cleft%5B%20n%20%5Cright%5D%20%3Df%5Cleft%5B%20n%20%5Cright%5D%20%2A%5Cleft%28%20k-1%20%5Cright%29%20%5E%7Bn-2%7D)

  1. n = 10
  2. k = 2
  3. MOD = 10**9+7
  4. # code 1
  5. F = [0]*(n+3)
  6. F[1] = k
  7. F[2] = k**2
  8. for i in range(3, n+1):
  9. F[i] = ((F[i-1]*(k-1)) % MOD+(F[i-2]*(k-1)) % MOD) % MOD
  10. print(F[n])
  11. # code 2
  12. b = k
  13. a = k**2
  14. for i in range(3, n+1):
  15. a, b = a+b, a
  16. print(a*pow(k-1, n-2, MOD))

第四题

2021_04_05_13_27_Office_Lens_(4).jpg
2021_04_05_13_27_Office_Lens_(5).jpg

题解:直接递归即可

  1. def f(L):
  2. if len(L) == 0:
  3. return 0
  4. elif len(L) == 1:
  5. return L[0]
  6. val = (min(L)+max(L))//2
  7. Left = [i for i in L if i <= val]
  8. Right = [i for i in L if i > val]
  9. print(Left,Right)
  10. return sum(L)+f(Left)+f(Right)
  11. L1 = [1, 2, 3,4]
  12. print(f(L1-sum(L1)))

第五题

2021_04_05_13_27_Office_Lens_(6).jpg
2021_04_05_13_27_Office_Lens_(7).jpg

题解:目测直接模拟即可