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

华为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)
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值