美文网首页
华为2019-逻辑字符串计算(Python)

华为2019-逻辑字符串计算(Python)

作者: AliceWhale | 来源:发表于2019-08-08 22:32 被阅读0次

    1. 题目说明

    常用的逻辑计算有 AND(表示为&), Or(表示为|),Not(表示为!)。
    其中他们的优先级关系是: Not(!)>And(&)>Or(!)
    例如:
    A|B&C 实际是 A|(B&C)
    A&B|C&D 实际是 (A&B)|(C&D)
    !A&B|C 实际是 ((!A)&B)|C
    计算某个合法字符串输入的输出结果

    2. 思路

    将字符串分为2类,一类是含有括号的字符串,一类是不含括号的字符串,对于含有括号的字符串,可以先将它转化为没有括号的字符串。问题转化为消解括号和计算没有括号的逻辑字符串的逻辑值。

    2.1消解括号

    可以通过一个栈来匹配消解括号,)总是和最近的(进行匹配,先把字符串不断送入栈中,碰到)的时候,在不断从栈中取出元素,计算两个括号之间字符串的逻辑值。

    2.2计算无括号的字符串逻辑值

    安装优先级的顺序从高优先级到低优先级不断消减逻辑判断符号,最终得到逻辑计算结果。

    3. Python代码

    import sys
    
    
    def calnotkuohao(s):
       slen = len(s)
       out = ""
       cnt = 0
       while cnt < slen:
           if s[cnt] == "!":
               out += str(int(not int(s[cnt+1])))
               cnt += 2
           else:
               out += s[cnt]
               cnt += 1
       s = out
       slen = len(s)
       out = ""
       cnt = 0
       while cnt < slen:
           if s[cnt] == "&":
               a = int(out[-1])
               out = out[:-1]
               out += str(int(int(s[cnt+1]) and a ))
               cnt += 2
           else:
               out += s[cnt]
               cnt += 1
       s = out
       slen = len(s)
       out = ""
       cnt = 0
       while cnt < slen:
           if s[cnt] == "|":
               a = int(out[-1])
               out = out[:-1]
               out += str(int(int(s[cnt + 1]) or a))
               cnt += 2
           else:
               out += s[cnt]
               cnt += 1
       return out
    
    if __name__ == "__main__":
       lines = sys.stdin.readlines()
       line = lines[0]
       stack1 = []
       ##消减括号
       for i in range(len(line)):
           if line[i] == ")":
               stackup = stack1.pop()
               strtmp = ""
               while stackup != "(":
                   strtmp = stackup + strtmp
                   stackup = stack1.pop()
               stack1.append(calnotkuohao(strtmp))
           else:
               stack1.append(line[i])
       last = "".join(stack1)
       ##计算无括号字符串逻辑值
       print(calnotkuohao(last))
    

    相关文章

      网友评论

          本文标题:华为2019-逻辑字符串计算(Python)

          本文链接:https://www.haomeiwen.com/subject/aoevkftx.html