145
题目描述:
给定一个二叉树,返回它的后序遍历。
示例:
解答:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
res,st,r,prev=[],[],root,None
while r or st:
# 一直往左走
while r:
st.append(r)
r=r.left
# 走到底,弹出栈顶
r=st.pop()
# 如果该节点的没有右节点或者右节点已经访问过
# 则访问该节点,并且让r指向空,
# 因为访问过该节点后,该节点的左子树必定访问过,
# 不应再往左节点走,而是再弹出栈顶元素
if not r.right or r.right==prev:
res.append(r.val)
prev = r
r = None
# 否则,再次入栈,访问右节点
else:
st.append(r)
r = r.right
return res
856
题目描述:
给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
() 得 1 分。
AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
(A) 得 2 * A 分,其中 A 是平衡括号字符串。
示例:
解答:
class Solution:
def scoreOfParentheses(self, S: str) -> int:
'''
#eval( )函数,用于去掉字符串上的引号
return eval(S.replace(')(',')+(').replace('()','1').replace('(','2*('))
'''
'''
s = ''
for i in range(len(S)-1):
if S[i] == '(':
if S[i+1] == "(":
s += "("
else:
s += '1'
else:
if S[i+1] == '(':
s += '+'
else:
s += ')*2'
return eval(s)
'''
stack = [0]
for c in S:
if c == "(": # "("入栈
stack.append(0)
else:
last = stack.pop()
if last == 0: # "()"情况
stack[-1] += 1
else: # "(A)" "AB" 情况
stack[-1] += 2 * last
return stack.pop()
1003
题目描述:
给你一个字符串 s ,请你判断它是否 有效 。
字符串 s 有效 需要满足:假设开始有一个空字符串 t = “” ,你可以执行 任意次 下述操作将 t 转换为 s :
将字符串 “abc” 插入到 t 中的任意位置。形式上,t 变为 tleft + “abc” + tright,其中 t == tleft + tright 。注意,tleft 和 tright 可能为 空 。
如果字符串 s 有效,则返回 true;否则,返回 false。
示例:
解答:
class Solution:
def isValid(self, s: str) -> bool:
'''
while s!=''and 'abc'in s:
s=s.replace('abc','')
return s==''
'''
res=[]
for i in s:
if len(res)<2:
res.append(i)
elif i=='c' and res[-1]=='b' and res[-2]=='a':
res.pop()
res.pop()
else:
res.append(i)
return len(res)==0
1130
题目描述:
给你一个正整数数组 arr,考虑所有满足以下条件的二叉树:
每个节点都有 0 个或是 2 个子节点。
数组 arr 中的值与树的中序遍历中每个叶节点的值一一对应。(知识回顾:如果一个节点有 0 个子节点,那么该节点为叶节点。)
每个非叶节点的值等于其左子树和右子树中叶节点的最大值的乘积。
在所有这样的二叉树中,返回每个非叶节点的值的最小可能总和。这个和的值是一个 32 位整数。
示例:
解答:
class Solution:
def mctFromLeafValues(self, arr: List[int]) -> int:
stack = []
mct = 0
for num in arr:
while stack and num > stack[-1]:
min_1 = stack.pop()
if stack:
min_2 = min(stack[-1],num)
else:
min_2 = num
mct = mct + min_1 * min_2
stack.append(num)
while len(stack) > 1:
mct = mct + stack.pop() * stack[-1]
return mct;
1178
题目描述:
外国友人仿照中国字谜设计了一个英文版猜字谜小游戏,请你来猜猜看吧。
字谜的迷面 puzzle 按字符串形式给出,如果一个单词 word 符合下面两个条件,那么它就可以算作谜底:
单词 word 中包含谜面 puzzle 的第一个字母。
单词 word 中的每一个字母都可以在谜面 puzzle 中找到。
例如,如果字谜的谜面是 “abcdefg”,那么可以作为谜底的单词有 “faced”, “cabbage”, 和 “baggage”;而 “beefed”(不含字母 “a”)以及 “based”(其中的 “s” 没有出现在谜面中)。
返回一个答案数组 answer,数组中的每个元素 answer[i] 是在给出的单词列表 words 中可以作为字谜迷面 puzzles[i] 所对应的谜底的单词数目。
示例:
解答:
'''
①不用考虑words[i]中重复的字符,以及字符的顺序
换句话说就是 “abbbbcd” 与 "aaaaadcb"应该有相同的hash值(a, b, c, d)
于是我们可以想到计数器
②对于每个puzzles[i],长度固定为7
于是我们可以在有限的空间内列举出所有puzzles[i]的组合
如: "abcdefg"的所有组合
'a', 'b', 'c', 'd', 'e', 'f' , 'g'
'ab', 'ac', 'ad' ......'abc', 'abd'........'abcdefg'
对于其中某个组合'abcd'来说,它的hash值为(a, b, c, d)可以匹配所有words中hash值为(a, b, c, d)的word, 如"abbbbbcd", ”aaaaaaadcb“ 同理组合'abc'可以匹配所有hash值为(a, b, c)的word
将所有组合可匹配的值加起来,就是我们puzzles[i]对应的answer[i]
③word必须包含puzzle的第一个字母
很简单,修改我们的组合思路
我们把除头字母外的puzzle[ i ]也就是puzzle[ i ][ 1 : ]进行组合,在每个组合结果上加上头字母就可满足
如'abcdefg':
查询的hash值应该为'a' + comb('bcdefg')(<-表示'bcdefg'的所有组合情况)
'''
from collections import Counter
from itertools import combinations
class Solution:
def findNumOfValidWords(self, words: List[str], puzzles: List[str]) -> List[int]:
counter, ans = Counter(filter(lambda x: len(x) <= 7, map(frozenset, words))), [0]*(len(puzzles))
for index, puzzle in enumerate(puzzles):
for comb in list(map(lambda i:combinations(puzzle[1:], i), range(7))):
ans[index] += sum(counter[frozenset((puzzle[0],)+ele)] for ele in comb)
return ans