第 303 场周赛 总结
第一个出现两次的字母
简单题,遍历列表,找到第二个重复出现的数据跳出循环
class Solution:
def repeatedCharacter(self, s: str) -> str:
ans = set()
for i in s:
if i in ans:return i
ans.add(i)
相等行列对
基本就是先行遍历,将对应行的数组用字典形式存储,key是行数据,value是出现次数。
然后列也同理建一个字典。最后遍历两个字典,相同key的项目value相乘最后加起来。
不过第一次用python写,不知道咋把list作为key存储,就先硬写。
之后参考大佬代码(不得不说,python有时候code太优雅了)
class Solution:
def equalPairs(self, grid: List[List[int]]) -> int:
cnt = Counter(tuple(row) for row in grid)
return sum(cnt[col] for col in zip(*grid))
zip和tuple能这样用我是第一次见到
设计食物评分系统
简单的构造题,由于要输出分数最高的菜,考虑用小顶堆的数据结构,
存储时分数取负也是为了小顶堆的架构
class FoodRatings:
def __init__(self, foods: List[str], cuisines: List[str], ratings: List[int]):
self.fs = {}
self.cs = defaultdict(list)
for f, c, r in zip(foods, cuisines, ratings):
self.fs[f] = [-r, c]
heappush(self.cs[c], (-r, f))
def changeRating(self, food: str, newRating: int) -> None:
f = self.fs[food]
heappush(self.cs[f[1]], (-newRating, food))
f[0] = -newRating
def highestRated(self, cuisine: str) -> str:
h = self.cs[cuisine]
while h[0][0] != self.fs[h[0][1]][0]:
heappop(h)
return h[0][1]
优质数对的数目
虽说是困难题,但其实逻辑很清晰。
考虑两个数对应位的分布
1 1 or 1 and 1 sum 2
0 1 or 1 and 0 sum 1
1 0 or 1 and 0 sum 1
0 0 or 0 and 0 sum 0
可以看出,计算后的结果其实是两个数二进制后所以1数目相加,
统计后,接个循环
class Solution:
def countExcellentPairs(self, nums: List[int], k: int) -> int:
cnt = Counter(x.bit_count() for x in set(nums))
res = 0
for k1, v1 in cnt.items():
for k2, v2 in cnt.items():
if k1 + k2 >= k:
res += v1 * v2
return res
看了题解区,原来还可以进行后缀优化的操作,真是tql
总结
摸了好几个月,重新做题的感觉一塌糊涂,而且从c++换到python编程,代码思路也有一定的转变,不过学到很多python的操作就是了。
接下来每天应该都会摸几题,然后每周打打周赛恢复一下手感(不能再咸鱼下去了)