leetcode双周赛134 周赛405比赛写的

双周赛:

leetcode3206

3206. 交替组 I - 力扣(LeetCode)

比赛时因为只需要找3个,所以就直接找就行

class Solution:
    def numberOfAlternatingGroups(self, colors: List[int]) -> int:
        cnt = 0
        n = len(colors)
        for i in range(0,n):
            if colors[i] != colors[i - 1]:
                if colors[i - 1] == colors[(i + 1) % n]:
                    cnt += 1
        return cnt

leetcode3207

3207. 与敌人战斗后的最大分数 - 力扣(LeetCode)

贪心,不断加最大的,除以最小的

class Solution:
    def maximumPoints(self, en: List[int], cu: int) -> int:
        en.sort()
        n = len(en)
        a = en[0]
        al = cu // a
        cu = cu % a
        j = n - 1
        def defen(cu,a):
            if a <= cu:
                fen = cu // a
                cu = cu % a
            else:
                fen = 0
            return fen,cu
        while j > 0:
            if al > 0:
                cu += en[j]
                j -= 1
                fen,cu = defen(cu,a)
                al += fen
            else:
                return al
        return al

周赛405

leetcode3210

3210. 找出加密后的字符串 - 力扣(LeetCode)

直接一个一个加,到那个字符的时候就加上,然后后面的也继续加

class Solution:
    def getEncryptedString(self, s: str, k: int) -> str:
        n = len(s)
        ans = ''
        for i in range(n):
            ans += s[(i + k) % n]
        return ans

leetcode3211

3211. 生成不含相邻零的二进制字符串 - 力扣(LeetCode)

这道题就很无语,本来以为n就是1-10,然后就一个一个写if和elif,然后竟然告诉我n是18,无奈只好继续写了。

思路就是在前后+1还有就是在前面和后面加一个不一样的数。

class Solution:
    def validStrings(self, n: int) -> List[str]:
        if n == 1:
            return ["0","1"]
        elif n == 2:
            return ["10","11",'01']
        elif n == 3:
            return ["010","011","101","110","111"]
        ans = ["010","011","101","110","111"]
        def jisuan(ans):
            arr = []
            for i in ans:
                arr.append('1' + i)
                arr.append(i + '1')
            for i in ans:
                if i[-1] == '1':
                    arr.append(i + '0')
                elif i[0] == '1':
                    arr.append('0' + i)
            arr = list(set(arr))
            return arr
        arr4 = jisuan(ans)
        arr5 = jisuan(arr4)
        arr6 = jisuan(arr5)
        arr7 = jisuan(arr6)
        arr8 = jisuan(arr7)
        arr9 = jisuan(arr8)
        arr10 = jisuan(arr9)
        arr11 = jisuan(arr10)
        arr12 = jisuan(arr11)
        arr13 = jisuan(arr12)
        arr14 = jisuan(arr13)
        arr15 = jisuan(arr14)
        arr16 = jisuan(arr15)
        arr17 = jisuan(arr16)
        arr18 = jisuan(arr17)
        if n == 4:
            return arr4
        elif n == 5:
            return arr5
        elif n == 6:
            return arr6
        elif n == 7:
            return arr7
        elif n == 8:
            return arr8
        elif n == 9:
            return arr9
        elif n == 10:
            return arr10
        elif n == 11:
            return arr11
        elif n == 12:
            return arr12
        elif n == 13:
            return arr13
        elif n == 14:
            return arr14
        elif n == 15:
            return arr15
        elif n == 16:
            return arr16
        elif n == 17:
            return arr17
        elif n == 18:
            return arr18

leetcode3212

3212. 统计 X 和 Y 频数相等的子矩阵数量 - 力扣(LeetCode)

一个二维前缀和,直接得吃了

class Solution:
    def numberOfSubmatrices(self, grid: List[List[str]]) -> int:
        n,m = len(grid),len(grid[0])
        arr = [[[0,0] for _ in range(m + 1)] for _ in range(n + 1)]
        for i in range(1,n + 1):
            for j in range(1,m + 1):
                if grid[i - 1][j - 1] == 'X':
                    arr[i][j] = [arr[i][j - 1][0] + 1,arr[i][j - 1][1]]
                elif grid[i - 1][j - 1] == 'Y':
                    arr[i][j] = [arr[i][j - 1][0],arr[i][j - 1][1] + 1]
                else:
                    arr[i][j] = arr[i][j - 1]
        for j in range(1,m + 1):
            for i in range(1,n + 1):
                arr[i][j] = [arr[i - 1][j][0] + arr[i][j][0],arr[i - 1][j][1] + arr[i][j][1]]
        cnt = 0
        for i in range(n + 1):
            for j in range(m + 1):
                if arr[i][j][0] == arr[i][j][1] and arr[i][j][0] >= 1:
                    cnt += 1
        return cnt

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值