[LeetCode周赛复盘] 第 303 场周赛20220724
一、本周周赛总结
- 掉分的一周。
- 前三题难得做挺快,第四题牢底坐穿。
二、 [Easy] 6124. 第一个出现两次的字母
链接: 6124. 第一个出现两次的字母
1. 题目描述
2. 思路分析
定级Easy。
按题意模拟即可。
3. 代码实现
class Solution:
def repeatedCharacter(self, s: str) -> str:
cnt = defaultdict(int)
for c in s:
cnt[c]+= 1
if cnt[c] == 2:
return c
三、[Medium] 6125. 相等行列对
链接: 6125. 相等行列对
1. 题目描述
2. 思路分析
定级Medium。
转置后暴力判断。
3. 代码实现
class Solution:
def equalPairs(self, grid: List[List[int]]) -> int:
n = len(grid)
g = [[0]*n for i in range(n)]
for i in range(n):
for j in range(n):
g[j][i] = grid[i][j]
ans = 0
for i in range(n):
for j in range(n):
if g[i] == grid[j]:
ans += 1
return ans
四、[Medium] 6092. 替换数组中的元素
链接: 6092. 替换数组中的元素
1. 题目描述
2. 思路分析
定级Medium。
和昨晚双周赛T3差不多,就是k,v的互相哈希。
3. 代码实现
class FoodRatings:
def __init__(self, foods: List[str], cuisines: List[str], ratings: List[int]):
self.f_c = defaultdict()
self.f_r = defaultdict()
from sortedcontainers import SortedList
self.c_rf = defaultdict(SortedList)
c_rf = self.c_rf
f_c = self.f_c
f_r = self.f_r
n = len(foods)
for f,c,r in zip(foods,cuisines,ratings):
c_rf[c].add((-r,f))
f_c[f] = c
f_r[f] = r
def changeRating(self, food: str, newRating: int) -> None:
c_rf = self.c_rf
f_c = self.f_c
f_r = self.f_r
f = food
c = f_c[food]
r = f_r[food]
c_rf[c].remove((-r,f))
r = newRating
c_rf[c].add((-r,f))
f_c[f] = c
f_r[f] = newRating
# print(c_rf)
def highestRated(self, cuisine: str) -> str:
return self.c_rf[cuisine][0][1]
# Your FoodRatings object will be instantiated and called as such:
# obj = FoodRatings(foods, cuisines, ratings)
# obj.changeRating(food,newRating)
# param_2 = obj.highestRated(cuisine)
五、[Hard] 6127. 优质数对的数目
链接: 6127. 优质数对的数目
1. 题目描述
2. 思路分析
定级Hard。
坐牢。
- 实际上发现a&b和a|b的位1个数和=a的个数+b的个数。
- 所以统计每个数的位1个数,排序后计算和大于k的对数即可。
3. 代码实现
class Solution:
def countExcellentPairs(self, nums: List[int], k: int) -> int:
"""
001 010 011 001
101 001 001
"""
nums = sorted(list(set(nums)))
def hammingWeight( n: int) -> int:
ret = 0
while n:
n &= n - 1
ret += 1
return ret
arr = []
for a in nums:
arr.append(hammingWeight(a))
arr.sort()
n = len(arr)
ans = 0
for i,a in enumerate(arr):
j = bisect_left(arr,k-a)
ans += n-j
return ans