if c in nums: valid = True v = v * 10 + int(c) else: if valid: if compute_flag != 1: v = -v if sign == '-'else v # 加减法直接记录 stack.append(v) if compute_flag == 1: evaluation(stack, op_stack) v, valid = 0, False if c == '(': stack.append( self.calculate(s)) elif c == ')': break else: # ['+', '-', '*', '/'] compute_flag = 1if c in ['*', '/'] else0 if compute_flag == 1: op_stack.append(c) else: sign = c # print('stack: {}'.format(stack)) # print('op_stack: {}'.format(op_stack)) if valid == True: if compute_flag != 1: v = -v if sign == '-'else v stack.append(v) if compute_flag == 1: evaluation(stack, op_stack) return greedy_evaluation(stack, op_stack)
defhelper(op1, op2, sign): if sign == '+': return op1 + op2 if sign == '-': return op2 - op1 if sign == '*': return op1 * op2 if sign == '/': return op2 // op1 if op2 >= 0else -(-op2 // op1) # 除法判断一下
defgreedy_evaluation(stack, op_stack): return sum(stack) # 就不用憨憨的再一个一个pop # res = None # while op_stack: # res = res if res != None else stack.pop(0) # sign = op_stack.pop(0) # op2 = stack.pop(0) # res = helper(op2, res, sign) # return res if res != None else stack[0]
classSolution: defcalculate(self, s: str) -> int: nums = [str(a) for a in range(10)] defhelper(op1, op2, sign): # 顺序不要搞反了 if sign == '+': return op1 + op2 if sign == '-': return op2 - op1 if sign == '*': return op1 * op2 if sign == '/': return op2 / op1 defevaluation(): if len(stack) < 2or stack[-2] == '(': return sign = op_stack.pop() op1, op2 = stack.pop(), stack.pop() res = helper(op1, op2, sign) stack.append(res)
stack = [] op_stack = [] v = 0 compute_flag = 0 state = State.begin if s[0] in nums: state = State.num else: state = State.op
i = 0 while i < len(s): c = s[i] if c == ' ': i += 1 continue if state == State.num: if c in nums: v = v * 10 + int(c) else: state = State.op stack.append(v) # print('stack: {}'.format(stack)) v = 0 evaluation() continue elif state == State.op: if c in nums: state = State.num continue else: if c == '(': stack.append(c) compute_flag = 0 elif c == ')': last = stack.pop() stack[-1] = last # 删除倒数第二个元素(对应的左括号) evaluation() else: compute_flag = 1 op_stack.append(c) else: print('illegal state.') i += 1 # print('stack: {}'.format(stack)) # print('op_stack: {}'.format(op_stack))
if state == State.num: stack.append(v) while op_stack: evaluation() return stack[0]
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None
import queue
classCodec:
defserialize(self, root): """Encodes a tree to a single string. :type root: TreeNode :rtype: str """ res = [] q = queue.Queue() ifnot root: return res deftraverse(root): ifnot root: res.append('null') return res.append(str(root.val)) q.put(root.left) q.put(root.right) whilenot q.empty(): cur = q.get() traverse(cur) traverse(root) while res[-1] == 'null': res.pop() ret = '[' + ','.join(res) + ']' print(ret) return ret
defdeserialize(self, data): """Decodes your encoded data to tree. :type data: str :rtype: TreeNode """ ifnot data: returnNone data = data[1:-1].split(',') data = [TreeNode(int(i)) if i != 'null'elseNonefor i in data] q = queue.Queue() root, i = data[0], 1 q.put(root) whilenot q.empty() and i < len(data): cur = q.get() if cur: cur.left = data[i] i += 1 q.put(cur.left) if i < len(data): cur.right = data[i] i += 1 q.put(cur.right) return root
# Your Codec object will be instantiated and called as such: # codec = Codec() # codec.deserialize(codec.serialize(root))
classSolution: defcanReach(self, arr: List[int], start: int) -> bool: n = len(arr) ifnot arr or start >= n or start < 0: returnFalse if len(arr) == 1: return arr[0] == 0 visited = [Falsefor _ in range(n)] visited[start] = True q = Queue() q.put(start)
whilenot q.empty(): cur = q.get() if arr[cur] == 0: returnTrue left = cur - arr[cur] right = cur + arr[cur] # print(left, right) for each in [left, right]: if each < 0or each >= n: continue ifnot visited[each]: visited[each] = True q.put(each) # print(list(q.queue)) if arr[each] == 0: returnTrue returnFalse