欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-13 14:21:06
...

华为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)
相关标签: python