1. 数组中紧跟 key 之后出现最频繁的数字
难度
- Easy
- Medium
- Hard
完成情况
- 独立完成
- 参考思路
- 参考答案
思路
按范围遍历,用字典记录频率即可。
代码
class Solution:
def mostFrequent(self, nums: List[int], key: int) -> int:
dic = defaultdict(int)
for i in range(len(nums) - 1):
if nums[i] == key: dic[nums[i + 1]] += 1
nums = list(dic.keys())
ans = 0
maxF = 0
for num in nums:
if dic[num] > maxF:
ans = num
maxF = dic[num]
return ans
2. 将杂乱无章的数字排序
难度
- Easy
- Medium
- Hard
完成情况
- 独立完成
- 参考思路
- 参考答案
思路
将排序算法的键值设置好就行,注意下数字本身为0的情况要特殊处理。因为算法默认是 stable 的,所以符合要求。
代码
class Solution:
def sortJumbled(self, mapping: List[int], nums: List[int]) -> List[int]:
def trans(x: int) -> int:
if x == 0: return mapping[0]
res = 0
i = 0
while x:
res += mapping[(x % 10)] * pow(10, i)
x //= 10
i += 1
return res
return sorted(nums, key = lambda x: trans(x))
3. 有向无环图中一个节点的所有祖先
难度
- Easy
- Medium
- Hard
完成情况
- 独立完成
- 参考思路
- 参考答案
思路
一次过,效率也还行。
要找所有祖先,其实就是找路径反转后的所有孩子。
用集合记录每个节点的所有孩子即可。另用一个数组记录当前节点是否已经求过孩子集合。最后返回每个集合排序后的列表即可。
代码
class Solution:
def getAncestors(self, n: int, edges: List[List[int]]) -> List[List[int]]:
graph = [[] for i in range(n)]
for e in edges:
graph[e[1]].append(e[0])
computed = [0 for i in range(n)]
fathers = [set() for i in range(n)]
def dfs(cur: int) -> Set[int]:
if computed[cur]: return fathers[cur]
fc = set()
for v in graph[cur]:
fc.add(v)
fc = fc.union(dfs(v))
computed[cur] = 1
fathers[cur] = fc
return fc
for i in range(n):
dfs(i)
return [sorted(list(fathers[i])) for i in range(n)]
4. 统计包含给定前缀的字符串
难度
- Easy
- Medium
- Hard
完成情况
- 独立完成
- 参考思路
- 参考答案
思路
试了次一行流hh
代码
class Solution:
def prefixCount(self, words: List[str], pref: str) -> int:
return sum(w.find(pref) == 0 for w in words)
5. 使两字符串互为字母异位词的最少步骤数
难度
- Easy
- Medium
- Hard
完成情况
- 独立完成
- 参考思路
- 参考答案
思路
又是一行流。枚举每一个字母,计算两个字符串在这个字母上的绝对差。双百。
代码
class Solution:
def minSteps(self, s: str, t: str) -> int:
return sum(abs(s.count(chr(97 + i)) - t.count(chr(97 + i))) for i in range(26))
6. 完成旅途的最少时间
难度
- Easy
- Medium
- Hard
完成情况
- 独立完成
- 参考思路
- 参考答案
思路
感觉不在周赛的时候脑子更灵活点hh
一眼感觉可以用二分查找答案做,果然一次通过,效率也不错。
代码
class Solution:
def minimumTime(self, time: List[int], totalTrips: int) -> int:
l, r = 1, totalTrips * max(time)
ans = r
while l <= r:
m = (l + r) // 2
if sum(m // t for t in time) >= totalTrips:
ans = ans if ans < m else m
r = m - 1
else: l = m + 1
return ans
Comments NOTHING