[LeetCode周赛复盘] 第 83 场双周赛20220723

[LeetCode周赛复盘] 第 83 场双周赛20220723

    • 一、本周周赛总结
    • 二、 [Easy] 6128. 最好的扑克手牌
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 三、[Medium] 6129. 全 0 子数组的数目
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 四、[Medium]6130. 设计数字容器系统
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 五、[Hard] 6131. 不可能得到的最短骰子序列
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现

一、本周周赛总结

  • 本来下定决心以后不打双周赛,耐不住群友躁动,还是打了,果然坐牢了。
  • 一开始系统崩了不能提交,直到四十多分钟,也不知道排名靠前的人怎么搞得。
  • 前三题很简单,第四题思维题完全没思路坐牢到结束,失眠到三点,掉26分。
    [LeetCode周赛复盘] 第 83 场双周赛20220723_第1张图片

二、 [Easy] 6128. 最好的扑克手牌

链接: 6128. 最好的扑克手牌

1. 题目描述

[LeetCode周赛复盘] 第 83 场双周赛20220723_第2张图片

2. 思路分析

定级Easy。
按顺序模拟即可,判断最多的那张牌情况。

3. 代码实现

class Solution:
    def bestHand(self, ranks: List[int], suits: List[str]) -> str:
        cnt_s = Counter(suits)
        cnt_r = Counter(ranks)
        
        if cnt_s.most_common(1)[0][1] == 5:
            return 'Flush'
        if cnt_r.most_common(1)[0][1] >= 3:
            return 'Three of a Kind'
        if cnt_r.most_common(1)[0][1] >= 2:
            return 'Pair'
        return 'High Card'

三、[Medium] 6129. 全 0 子数组的数目

链接: 6129. 全 0 子数组的数目

1. 题目描述

[LeetCode周赛复盘] 第 83 场双周赛20220723_第3张图片

2. 思路分析

定级Medium。

  • 对连续的0分段,统计每段长度k,这段对答案的贡献是(k+1)*k//2。
  • 写麻烦了,其实直接判0累加k即可。
  • 一开始公式想成了2^n-1, 这个实际上是子序列的数目。

3. 代码实现

class Solution:
    def zeroFilledSubarray(self, nums: List[int]) -> int:
        l = -1
        r = 0
        n = len(nums)
        ans = 0
        for i,a in enumerate(nums):
            if a == 0:
                if l == -1:
                    l = r = i
                else:
                    r = i
            else:
                if l != -1:
                    # print(l,r)
                    # ans += 2**(r - l + 1)-1
                    ans += (r - l + 1)*(r-l+2)//2
                    l = -1
        if l!=-1:
            ans += (r - l + 1)*(r-l+2)//2
        return ans

四、[Medium]6130. 设计数字容器系统

链接: 6130. 设计数字容器系统

1. 题目描述

[LeetCode周赛复盘] 第 83 场双周赛20220723_第4张图片

2. 思路分析

定级Medium。

  • 比较简单,题意一看先想到两个哈希表存k,v的互相映射。
  • 由于要维护v对应每个下标顺序,因此v映射k要用有序集合。
  • 数据范围1e5,因此复杂度不能超过nlgn,那么用sortedset即可。

3. 代码实现

class NumberContainers:

    def __init__(self):
        self.a = defaultdict(int)
        from sortedcontainers import SortedSet
        self.b = defaultdict(SortedSet)


    def change(self, index: int, number: int) -> None:
        if index in self.a:            
            s = self.b[self.a[index]]            
            s.remove(index)
        self.a[index] = number
        self.b[number].add(index)


    def find(self, number: int) -> int:
        if number in self.b and self.b[number]:
            return self.b[number][0]
        return -1



# Your NumberContainers object will be instantiated and called as such:
# obj = NumberContainers()
# obj.change(index,number)
# param_2 = obj.find(number)

五、[Hard] 6131. 不可能得到的最短骰子序列

链接: 6131. 不可能得到的最短骰子序列

1. 题目描述

[LeetCode周赛复盘] 第 83 场双周赛20220723_第5张图片

2. 思路分析

定级Hard

  • 这题坐牢到结束,如果见过这题有应该会比较快的做出来。
  • 网上找了解释,按这个思路来说,只需要划分子串即可,保证每个子串都有1-k且最短。
  • 没个部分最后一个数一定在这个子串里第一次出现,也只出现一次,因此构造这个‘非子序列’可以取每个串最后一个点,然后最后一个串一定是不足的部分,取个不存在的点。
  • [LeetCode周赛复盘] 第 83 场双周赛20220723_第6张图片

3. 代码实现

class Solution:
    def shortestSequence(self, rolls: List[int], k: int) -> int:
        ans = 1
        s = set()
        for r in rolls:
            s.add(r)
            if len(s) == k:
                ans += 1
                s.clear()
        return ans

你可能感兴趣的:(力扣周赛复盘,leetcode,算法,职场和发展)