classSolution:defisNumber(self, s:str)->bool:
state=[{' ':0,'s':1,'d':2,'.':4},# 状态0,空格后面可以跟的字符{'d':2,'.':4},# 状态1,+ - 后面可以跟的字符{'d':2,'.':3,'e':5,' ':8},# 2,数字后面可以跟的字符{'e':5,'d':3,' ':8},# 3,数字.数字 后面可以跟的字符{'d':3},# 4,空格.数字 后面可以跟的字符{'s':6,'d':7},# 5,e后面可以跟的字符{'d':7},# 6,e+/- 后面可以跟的字符{'d':7,' ':8},# 7,数字后可以跟的字符{' ':8}# 8, 末尾的空格可以跟的字符]
p =0for c in s:if'0'<=c<='9': t ='d'elif c in'+-': t ='s'elif c ==' 'or c=='.': t=c
elif c in'eE': t ='e'else: t ='?'if t notin state[p]:returnFalse
p = state[p][t]return p in[2,3,7,8]
剑指 Offer 34. 二叉树中和为某一值的路径
classSolution:defpathSum(self, root: TreeNode, target:int)-> List[List[int]]:
path =[]
res =[]defrecur(node, target):ifnot node:return
path.append(node.val)
target-=node.val
if target ==0andnot node.left andnot node.right:
res.append(list(path))
recur(node.left,target)
recur(node.right,target)
path.pop()
recur(root,target)return res
# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left = None# self.right = NoneclassCodec:defserialize(self, root):"""Encodes a tree to a single string.
:type root: TreeNode
:rtype: str
"""ifnot root:return'None'returnstr(root.val)+','+str(self.serialize(root.left))+','+str(self.serialize(root.right))defdeserialize(self, data):"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""defdfs(datalist):
val = datalist.pop(0)if val =='None':returnNone
root = TreeNode(int(val))
root.left = dfs(datalist)
root.right = dfs(datalist)return root
datalist = data.split(',')return dfs(datalist)# Your Codec object will be instantiated and called as such:# codec = Codec()# codec.deserialize(codec.serialize(root))
剑指 Offer 67. 把字符串转换成整数
classSolution:defstrToInt(self,str:str)->int:
s =str.strip()# 去除首部空格ifnot s:return0
res =0
max_num =2**31-1#数字上限
min_num=-2**31#数字下限
bandry =2**31//10#门限,用来判断接下来的拼接是否能够顺利进行,是否会超过数字上下限
sign =1# 假设符号为+
i=1# 假设第一位是符号位,数字从第二位开始if s[0]=='-':
sign =-1elif s[0]!='+':
i=0# 第一位没有符号位,直接是数字for c in s[i:]:ifnot'0'<= c <='9':breakif res>bandry or res==bandry and c >'7':return max_num if sign==1else min_num
res = res*10+ord(c)-ord('0')return sign*res
剑指 Offer 66. 构建乘积数组
classSolution:defconstructArr(self, a: List[int])-> List[int]:
res =[1]*len(a)
tmp =1for i inrange(1,len(a)):
res[i]= res[i-1]*a[i-1]#前缀乘积for i inrange(len(a)-2,-1,-1):
tmp *= a[i+1]# 后缀乘积
res[i]*= tmp
return res