本周几道题目难度一般,最后一题并不是很难,但数据规模稍微有点大 Python 代码容易超时。
中国站传送门 | 国际站传送门 |
1. 公因子的数目
比较简单,逐个检查即可。Python 代码只需要一行。
class Solution:
def commonFactors(self, a: int, b: int) -> int:
return sum(1 for x in range(1, min(a, b) + 1) if a % x == 0 and b % x == 0)
2. 沙漏的最大总和
同样非常简单,遍历即可,注意不要越界。
class Solution:
def maxSum(self, grid: List[List[int]]) -> int:
m, n = len(grid), len(grid[0])
res = 0
for i in range(m - 2):
for j in range(n - 2):
res = max(
res,
grid[i][j] + grid[i][j + 1] + grid[i][j + 2] +
grid[i + 1][j + 1] +
grid[i + 2][j] + grid[i + 2][j + 1] + grid[i + 2][j + 2]
)
return res
3. 最小 XOR
题目本身不困难,但实现时务必小心,这种精细操作题目比较出 BUG.
class Solution:
def minimizeXor(self, num1: int, num2: int) -> int:
def pop_count(x):
return bin(x).count('1')
c1, c2 = pop_count(num1), pop_count(num2)
if c1 >= c2:
# most significant bit
ms = 1 << (len(bin(num1)) - 3)
mask = ms
while pop_count(num1 & mask) < c2:
mask = (mask >> 1) + ms
return num1 & mask
else: # c1 < c2
mask = 1
while pop_count((~num1 & mask)) + c1 < c2:
mask = (mask << 1) + 1
return num1 | mask
4. 对字母串可执行的最大删除数
这个题目本身并不是特别困难,但题目数据规模有点大,Python 代码容易超时。
class Solution:
def deleteString(self, s: str) -> int:
n = len(s)
# lp[i][j] is longest prefix for i and j
lp = [[0] * (n + 1) for _ in range(n + 1)]
for i in range(n - 1, -1, -1):
for j in range(i, n):
if s[i] == s[j]:
lp[i][j] = lp[i + 1][j + 1] + 1
res = [1] * n
for i in range(n - 2, -1, -1):
for j in range(i + 1, n):
if j + j - i > n:
break
if lp[i][j] >= j - i:
res[i] = max(res[i], res[j] + 1)
return res[0]