本文最后更新于 3 分钟前,文中所描述的信息可能已发生改变。
3701. 计算交替和 - 力扣(LeetCode)
题目类型
#遍历
解题思路
参考:这道题很简单!
示例代码
python
class Solution:
def alternatingSum(self, nums: List[int]) -> int:
return sum(nums[::2]) - sum(nums[1::2])3702. 按位异或非零的最长子序列 - 力扣(LeetCode)
题目类型
#位运算 #贪心
解题思路
参考:这道题很简单!
示例代码
python
class Solution:
def longestSubsequence(self, nums: List[int]) -> int:
n = len(nums)
v = reduce(xor, nums)
if sum(nums) == 0:
return 0
return n if v else n - 13703. 移除 K-平衡子字符串 - 力扣(LeetCode)
题目类型
#栈
解题思路
用栈记录不同括号数量,当出现右括号时,尝试批量移除栈顶括号。
示例代码
python
class Solution:
def removeSubstring(self, s: str, k: int) -> str:
st = []
for c in s:
if st and st[-1][0] == c:
st[-1][1] += 1
else:
st.append([c, 1])
if c == ")" and len(st) > 1 and st[-1][1] == k and st[-2][1] >= k:
st.pop()
st[-1][1] -= k
if st[-1][1] == 0:
st.pop()
return "".join(c * x for c, x in st)3704. 统计和为 N 的无零数对 - 力扣(LeetCode)
题目类型
#数位DP
解题思路
从高往低数位 DP,x 表示第一个数是否填了数字,y 表示第二个数是否填了数字,carry 表示前一个数位是否借位。
从低往高数位 DP 见参考。
示例代码
python
class Solution:
def countNoZeroPairs(self, n: int) -> int:
nums = list(map(int, str(n)))
m = len(nums)
@cache
def dfs(i, x, y, carry):
if i == m:
return int(x == y > carry)
res = 0
s = nums[i] + carry * 10
for nx in range(x, 10):
for b in range(2):
ny = s - nx - b
if y <= ny < 10:
res += dfs(i + 1, int(nx > 0), int(ny > 0), b)
return res
ans = dfs(0, 0, 0, 0)
dfs.cache_clear()
return anspython
class Solution:
def countNoZeroPairs(self, n: int) -> int:
nums = list(map(int, str(n)))
m = len(nums)
def cal(x):
return max(0, min(x - 1, 19 - x))
@cache
def dfs(i, b, is_num):
if i < 0:
return 1 - b
h = nums[i] - b
if not is_num:
if i > 0 and h == 0:
return 0
return dfs(i - 1, h < 0, False)
res = 0
if i < m - 1:
if h != 0:
res = dfs(i - 1, h < 0, False) * 2
elif i == 0:
res = 1
res += dfs(i - 1, False, True) * cal(h)
res += dfs(i - 1, True, True) * cal(h + 10)
return res
ans = dfs(m - 1, False, True)
dfs.cache_clear()
return ans