leetcode 第 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的操作就是了。
接下来每天应该都会摸几题,然后每周打打周赛恢复一下手感(不能再咸鱼下去了)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值