华为2019校招笔试-逻辑计算

牧云@^-^@ 提交于 2019-12-25 03:02:49

华为2019校招笔试-逻辑计算

题目描述

常用的逻辑运算有And(表示为&),Or(表示为|),Not(表示为!),他们的逻辑是:

1&1=1 1&0=0 0&1=0 0&0=0
1|1=1 1|0=1 0|1=1 0|0=0
!0=1 !1=0

其中,他们的优先关系为:Not(!)>And(&)>Or(|);
例如:

A|B&C 实际是 A(B&C)  
A&B|C&D 实际是 (A&B)|(C&D)  
!A&B|C 实际是 ((!A)&B)|C

输入描述

1.测试用例中间无空格,无需考虑空格
2.测试用例表示式中只会出现如下字符:

0,1,(,),&,|,!

3.测试用例所给的输入输出都是合法的。无需考虑非法输入。
4.测试用例表达式长度不会超过128个字符。
5.括号可以嵌套。

例如:

1|(1&0) = 1
1&0|0&1 = 0
!0&1|0 = 1
((!0&1))|0 = 1

示例1

输入

!(1&0)|0&1

输出

1

示例2

输入

!(1&0)&0|0

输出

0
#思路:有括号先把括号内内容取出运算。然后把运算完的结果拼接,作为新的输入。没有括号时,按照优先级#顺序运算。
#每一步都有输入输出参数。s1为某一步输入 s2为某一步输出 
s='!(1&0)&0|0'
while(len(s)!=1):

    p1=0
    p2=0
    for i in range(len(s)):
        if(s[i]=='('):
            p1=i
        if(s[i]==')'):
            p2=i
            break

    #!   !1&0|0&1
    if(p1!=p2):
        s1=s[p1+1:p2]
    else:
        s1=s
    print('输入',s1)
    s2=''
    for i in range(len(s1)):
        if(i>0 and s1[i-1]=='!'):
            continue
        if(s1[i]=='!'):
            if(s1[i+1]=='0'):
                s2=s2+'1'
            else:
                s2=s2+'0'
        else:
            s2=s2+s1[i]

    print(s2)
    #&
    s1=s2
    s2=''
    #s2为输出,s1指针如果指向了运算符,要判断是否和s2最后一项做运算。从而保证循环一遍就得到结果 
    #时间复杂度o(n)。
    for i in range(len(s1)):
        if(i>1 and s1[i-1]=='&'):
            continue
        if(s1[i]!='&'):
            s2=s2+s1[i]
        else:
            if(s2[len(s2)-1]=='1' and s1[i+1]=='1'):
                s2=s2[:len(s2)-1]+'1'
            else:
                s2=s2[:len(s2)-1]+'0'
    #|
    print(s2)
    s1=s2
    s2=''
    for i in range(len(s1)):
        if(i>1 and s1[i-1]=='|'):
            continue
        if(s1[i]!='|'):
            s2=s2+s1[i]
        else:
            if(s2[len(s2)-1]=='0' and s1[i+1]=='0'):
                s2=s2[:len(s2)-2]+'0'
            else:
                s2=s2[:len(s2)-1]+'1'
    print('本次输入输出',s2)
    if(p1!=p2):
        s=s[:p1]+s2+s[p2+1:]
    else:
        s=s2
    print('输出',s)
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!