讨论/题目交流/🏆 第 172 场力扣周赛/
🏆 第 172 场力扣周赛

欢迎小伙伴们在这里交流分享你的参赛心得以及体验。【前往竞赛】

image.png

3 分 - 6 和 9 组成的最大数字
4 分 - 竖直打印单词
5 分 - 删除给定值的叶子节点
6 分 - 灌溉花园的最少水龙头数目

展开讨论

6 和 9 组成的最大数字

用字符串做抢了把时间, 判断有没有6,和第一个6的位置

class Solution:
    def maximum69Number (self, num: int) -> int:
        if '6' not in str(num):
            return num
        for i, v in enumerate(str(num)):
            if v=='6':
                return int(str(num)[:i]+'9'+str(num)[i+1:])

竖直打印单词

用空格切分字符串,去最长字符串长度,在暴力遍历,越界追加空格

class Solution:
    def printVertically(self, s: str) -> List[str]:
        lis = s.split(' ')
        res = []
        tag = 0
        ma = 0
        for i in lis:
            ma = max(ma, len(i))

        for i in range(ma):
            tmp = ""
            for i in range(len(lis)):
                if tag>len(lis[i])-1:
                    tmp+=" "
                else:
                    tmp+=lis[i][tag]
            res.append(tmp.rstrip(' '))
            tag+=1
        return res

删除给定值的叶子节点

后序遍历,判断左右子节点是不是空,自己本身是不是等于目标值,符合的话=空
测试用例错了一个,以为眼瞎看错题,硬是瞪了3分钟才提交

class Solution:
    def removeLeafNodes(self, root: TreeNode, target: int) -> TreeNode:


        def dfs(node, parent, tag):
            if not node: return

            dfs(node.left, node, 'L')
            dfs(node.right, node, 'R')

            if node.val==target and not node.right and not node.left:
                if tag=='L':
                    parent.left = None
                elif tag=='R':
                    parent.right = None
                elif tag=='':
                    root = None

        dfs(root, None, '')

        if not root.left and not root.right and root.val==target:
            root = None

        return root

灌溉花园的最少水龙头数目

预处理一下每个点覆盖范围,左界和右届,按左界升序排序
贪心一下,如果最左端覆盖不到0,直接返回-1
如果中间有覆盖不到区域也返回-1
其他情况就按照右端,来删除前面 比如[0, 4], [2, 5], [3, 6] 遇到3,6就删除2,5
根据左端覆盖情况来判断

class Solution:
    def minTaps(self, n: int, ranges: List[int]) -> int:
        ran = []
        for i, v in enumerate(ranges):
            ran.append([i-v, i+v])

        ran.sort()
        res = [ran[0]]

        print(ran)

        low, height = ran[0][0], ran[0][1]

        for i in range(1, len(ran)):
            ll, hh = ran[i]
            if ll>height:
                return -1

            elif low<=0 and ll<=0 and ll>=low and hh>=height:
                res.pop()
                res.append(ran[i])
                low = ll
                height = hh
            elif hh<=height:
                continue
            elif hh>height:
                while len(res)>1 and ll<=res[-2][1]:
                    res.pop()
                height = hh
                res.append(ran[i])

            if hh>=n: break

        return len(res) if height>=n else -1
2
展开全部 9 讨论