• leetcode1106


    做了一个解,但是WA,54/70,这个无法通过的测试用例有300个字符,太复杂了,我现在无法通过测试用例分析出哪里写的不对,感觉换一个思路更好一些:

     1 class Solution:
     2     def parseBoolExpr(self, expression: str) -> bool:
     3         n = len(expression)
     4         opstack = []
     5         boolstack = []
     6         savenum = []
     7         curnum = 0
     8         for i in range(n):
     9             cur = expression[i]
    10             if cur == '(':
    11                 if curnum > 0:
    12                     savenum.append(curnum)
    13                     curnum = 0
    14             elif cur == ')':
    15                 op = opstack.pop(-1)
    16                 if op == '!':
    17                     boolstack[-1] = not boolstack[-1]
    18                 else:
    19                     if op == '&':
    20                         bsop = True
    21                         bn = len(boolstack)
    22                         blist = boolstack[bn-curnum:]
    23                         while curnum > 0:
    24                             boolstack.pop()
    25                             curnum -= 1
    26                         for b in blist:
    27                             bsop = bsop and b
    28                         boolstack.append(bsop)
    29                     else:
    30                         bsop = False
    31                         bn = len(boolstack)
    32                         blist = boolstack[bn-curnum:]
    33                         while curnum > 0:
    34                             boolstack.pop()
    35                             curnum -= 1
    36                         for b in blist:
    37                             bsop = bsop or b
    38                         boolstack.append(bsop)
    39                     if len(savenum) > 0:
    40                         pnum = savenum.pop(-1)
    41                         curnum = pnum + 1
    42                     else:
    43                         curnum = 1
    44             elif cur == '&' or cur == '|' or cur == '!':
    45                 opstack.append(cur)
    46             elif cur == 't' or cur == 'f':
    47                 curnum += 1
    48                 bl = True if cur == 't' else False
    49                 boolstack.append(bl)
    50             elif cur == ',':
    51                 continue
    52             else:
    53                 print('error')
    54         return boolstack.pop(-1)

    下面给出一个AC的解,这个和我的思路接近,使用栈来存储运算顺序,使用set()来进行括号内部的运算,可以减少手工运算的错误。

    参考:https://leetcode.com/problems/parsing-a-boolean-expression/discuss/323390/Python-simple-solution-using-stack-easy-to-understand

     1 class Solution(object):
     2     def parseBoolExpr(self, expression):
     3         """
     4         :type expression: str
     5         :rtype: bool
     6         """
     7         stack = []
     8         for e in expression:
     9             if e in '!|&ft(':
    10                 stack.append(e)
    11             if e == ')':
    12                 exp = set()
    13                 while stack:
    14                     b = stack.pop()
    15                     if b != '(':
    16                         exp.add(True if b == 't' else False)
    17                     else:
    18                         operator = stack.pop()
    19                         if operator == '&':
    20                             r = all(exp) 
    21                         if operator == '|':
    22                             r = any(exp)
    23                         if operator == '!':
    24                             r = not all(exp)
    25                         stack.append('t' if r else 'f')
    26                         break
    27         return True if stack[-1] == 't' else False   

    算法中的本质和核心的问题,终究还是数学问题。

    习惯性不擅长数学的我,算法水平也就是这样了。

  • 相关阅读:
    win10去除桌面快捷方式小箭头
    java创建线程的几种方式
    Spring知识点总结
    Myeclipse运行报错:an out of memory error has occurred的解决方法
    vue-cli的使用
    3种jQuery弹出大图效果
    Weixin API -- 微信js接口
    setTimeOut传参数
    PHP的八种数据类型
    99%的人都理解错了HTTP中GET与POST的区别
  • 原文地址:https://www.cnblogs.com/asenyang/p/11109457.html
Copyright © 2020-2023  润新知