华为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)
来源:CSDN
作者:算云烟xxx
链接:https://blog.csdn.net/qq_33389136/article/details/103690374