1. 统计各位数字之和为偶数的整数个数
难度
- Easy
- Medium
- Hard
完成情况
- 独立完成
- 参考思路
- 参考答案
思路
数据范围不大,直接遍历每一个可能的数字即可。
代码
class Solution:
def countEven(self, num: int) -> int:
def isEven(x: int) -> bool:
sum = 0
while x:
sum += x % 10
x //= 10
return (sum & 1) == 0
return sum(isEven(i) for i in range(1, num + 1))
2. 合并零之间的节点
难度
- Easy
- Medium
- Hard
完成情况
- 独立完成
- 参考思路
- 参考答案
思路
每当遇见值为 0 的节点,且其后还有节点,那么在答案链上新增一个节点,并让 cur
指向新增节点;否则将当前节点值累加到 cur
上。为了方便起见,用一个 dummy
节点作为答案链的开头,最后返回 dummy.next
。
代码
class Solution:
def mergeNodes(self, head: Optional[ListNode]) -> Optional[ListNode]:
dummy = ListNode()
cur = dummy
while head:
if head.val == 0 and head.next != None:
p = ListNode()
cur.next = p
cur = cur.next
else:
cur.val += head.val
head = head.next
return dummy.next
3. 构造限制重复的字符串
难度
- Easy
- Medium
- Hard
完成情况
- 独立完成
- 参考思路
- 参考答案
思路
因为题目说明了,不必使用全部的字符,所以不用考虑最后一种字符的数量超过重复上限的情况(这种情况比较麻烦)。那么直接从最大的字符开始构造,如果超过数量,那么添加一个小一级的字符,再继续构造即可。
代码
class Solution:
def repeatLimitedString(self, s: str, repeatLimit: int) -> str:
nums = [0 for i in range(26)]
for c in s:
nums[ord(c) - ord('a')] += 1
ans = ""
cnt = 0
i = 25
while nums[i] == 0 and i >= 0:
i -= 1
while i >=0:
ans += chr(ord('a') + i)
cnt += 1
nums[i] -= 1
while nums[i] == 0 and i >= 0:
i -= 1
cnt = 0
if cnt == repeatLimit:
j = i - 1
while nums[j] == 0 and j >= 0: j -= 1
if j == -1: return ans
ans += chr(ord('a') + j)
nums[j] -= 1
cnt = 0
return ans
4. 统计数组中相等且可以被整除的数对
难度
- Easy
- Medium
- Hard
完成情况
- 独立完成
- 参考思路
- 参考答案
思路
数据范围不大,一行流。
代码
class Solution:
def countPairs(self, nums: List[int], k: int) -> int:
return sum(nums[i] == nums[j] and (i * j) % k == 0 for i in range(len(nums)) for j in range(i + 1, len(nums)))
5. 找到和为给定整数的三个连续整数
难度
- Easy
- Medium
- Hard
完成情况
- 独立完成
- 参考思路
- 参考答案
思路
很简单的问题,三个连续整数的和,一定等于中间的数乘以三。
代码
class Solution:
def sumOfThree(self, num: int) -> List[int]:
if num % 3 != 0: return []
return [(num // 3) - 1,num // 3 , (num // 3) + 1]
6. 拆分成最多数目的正偶数之和
难度
- Easy
- Medium
- Hard
完成情况
- 独立完成
- 参考思路
- 参考答案
思路
不知道 Solution
的调用是怎么样的, __nums
数组实际上计算一次就可以一直用,所以打表也是可以的,会很快。
代码
class Solution:
__nums: List[int]
__n: int
def __init__(self) -> None:
self.__nums = [0]
cur = 1
while self.__nums[cur - 1] < 1e10:
self.__nums.append(self.__nums[cur - 1] + (cur << 1))
cur += 1
self.__n = len(self.__nums)
def maximumEvenSplit(self, finalSum: int) -> List[int]:
if (finalSum & 1) == 1: return []
l, r = 0, self.__n - 1
while l <= r:
m = (l + r) // 2
if self.__nums[m] == finalSum:
r = m
break
elif self.__nums[m] > finalSum: r = m - 1
else: l = m + 1
ans = []
for i in range(1, r + 1):
ans.append(i << 1)
ans[r - 1] += finalSum - sum(ans)
return ans
Comments NOTHING