记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
目录
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