LeetCode 每日一题 2023/2/6-2023/2/12

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步




2/6 2331. 计算布尔二叉树的值

dfs 判断每个节点

class TreeNode(object):
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
def evaluateTree(root):
    """
    :type root: Optional[TreeNode]
    :rtype: bool
    """
    def func(node):
        if node.val==0 or node.val==1:
            return node.val
        elif node.val==3:
            return func(node.left) and func(node.right)
        else:
            return func(node.left) or func(node.right)
    return func(root)==1




2/7 1604. 警告一小时内使用相同员工卡大于等于三次的人

提取每个人的打卡时间 排列后
如果第i次打卡与第i+2次打卡相差在60分钟内 说明大于等于三次了

def alertNames(keyName, keyTime):
    """
    :type keyName: List[str]
    :type keyTime: List[str]
    :rtype: List[str]
    """
    from collections import defaultdict
    m = defaultdict(list)
    def gettime(time):
        return int(time[:2])*60+int(time[3:])
    for i in range(len(keyName)):
        m[keyName[i]].append(gettime(keyTime[i]))
        
    ans = []
    for name in m.keys():
        t = m[name]
        t.sort()
        if len(t)>=3:
            for i in range(len(t)-2):
                if t[i+2]-t[i]<=60:
                    ans.append(name)
                    break
    return sorted(ans)



2/8 1233. 删除子文件夹

先将folder内排序
字典树
考虑每一个文件路径 end作为结束标签
如果当前路径已经遇到了一个end说明当前路径为子文件夹 无需继续

def removeSubfolders(folder):
    """
    :type folder: List[str]
    :rtype: List[str]
    """
    folder.sort()
    m = {}
    for s in folder:
        l = s[1:].split("/")
        cur = m
        end = True
        for cd in l:
            if cd in cur:
                if "end" in cur[cd]:
                    end = False
                    break
                else:
                    cur = cur[cd]
            else:
                cur[cd]={}
                cur = cur[cd]
        if end:
            cur["end"]=1
    global ans
    ans = []
    def func(node,l):
        global ans
        for k,v in node.items():
            if k=="end":
                ans.append("/"+"/".join(l))
                continue
            else:
                func(v,l+[k])
    func(m,[])
    return ans



2/9 1797. 设计一个验证系统

map保存验证码和过期时间

class AuthenticationManager(object):

    def __init__(self, timeToLive):
        """
        :type timeToLive: int
        """
        self.ttl = timeToLive
        self.m = {}


    def generate(self, tokenId, currentTime):
        """
        :type tokenId: str
        :type currentTime: int
        :rtype: None
        """
        self.m[tokenId] = currentTime+self.ttl


    def renew(self, tokenId, currentTime):
        """
        :type tokenId: str
        :type currentTime: int
        :rtype: None
        """
        if tokenId in self.m and self.m[tokenId]>currentTime:
            self.m[tokenId] = currentTime+self.ttl


    def countUnexpiredTokens(self, currentTime):
        """
        :type currentTime: int
        :rtype: int
        """
        ans = 0
        for t in self.m.values():
            if t>currentTime:
                ans +=1
        return ans




2/10 1223. 掷骰子模拟

回溯
剩余i次 上一次为pre 剩余可出现left
如果选的值与上一次相同 且left>0 则进入(i-1,pre,left-1)
如果选的值v与上次不同 则进入(i-1,v,rollMax[v]-1)

def dieSimulator(n, rollMax):
    """
    :type n: int
    :type rollMax: List[int]
    :rtype: int
    """
    MOD = 10**9+7
    mem = {}
    def func(i,pre,left):
        if (i,pre,left)in mem:
            return mem[(i,pre,left)]
        ans = 0
        if i==0:
            return 1
        for v,num in enumerate(rollMax):
            if v==pre:
                if left:
                    ans += func(i-1,pre,left-1)
            else:
                ans += func(i-1,v,num-1)
        mem[(i,pre,left)] = ans%MOD
        return ans%MOD
    ans = 0
    for v,num in enumerate(rollMax):
        ans = (ans+func(n-1,v,num-1))%MOD
    return ans
    

2/11 2335. 装满杯子需要的最短总时长

将杯数从小到大排序a<=b<=c
如果c>=a+b 则需要c次 每次c与a或b一起 最后c单独
否则可以c与a或b一起 最后a,b平均剩余(a+b-c)//2 如果无法平分则再多一次


def fillCups(amount):
    """
    :type amount: List[int]
    :rtype: int
    """
    amount.sort()
    a,b,c=amount[0],amount[1],amount[2]
    if c>=a+b:
        return c
    else:
        ans = c+(a+b-c)//2
        return ans+1 if (a+b-c)%2 else ans



2/12 1138. 字母板上的路径

m[x]存储字母x的坐标
先挪左右 再挪上下
特殊考虑z字母移动 无法左右挪动 先往上移动一格

def alphabetBoardPath(target):
    """
    :type target: str
    :rtype: str
    """
    m = {}
    m["z"] = (5,0)
    for i in range(5):
        for j in range(5):
            c = chr(ord("a")+i*5+j)
            m[c]=(i,j)
            
    x,y = 0,0
    ans = ""
    for c in target:
        i,j = m[c]
        if i==x and j==y:
            ans+="!"
            continue
        if x==5:
            ans +="U"
            x = 4        
        while y!=j:
            n = abs(y-j)
            if y>j:
                ans +="L"*n
            else:
                ans +="R"*n
            y = j
        while x!=i:
            n = abs(x-i)
            if x>i:
                ans +="U"*n
            else:
                ans +="D"*n
            x = i
        ans+="!"
    return ans



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值