美团校招-表达式求值
题目描述
给出一个布尔表达式的字符串,比如:true or false and false,表达式只包含true,false,and和or,现在要对这个表达式进行布尔求值,计算结果为真时输出true、为假时输出false,不合法的表达时输出error(比如:true true)。表达式求值是注意and 的优先级比 or 要高,比如:true or false and false,等价于 true or (false and false),计算结果是 true。
我的题解
import java.util.Scanner;
public class expression2bool {
public static void main(String[] args) {
int res = expression2bool.func();
if (res==0) System.out.println("error");
else if (res==1) System.out.println("true");
else System.out.println("false");
}
public static int func(){//0:error 1:true 2:false
Scanner sc = new Scanner(System.in);
String inp = sc.nextLine();
sc.close();
String []expArr = inp.split(" ");
int len = expArr.length;
int arr [] = new int[len];//字符串比较太麻烦,太耗时,转整数。 0:false,1:true, 2:and, 3: or
if (len%2==0) return 0;//长度为偶数,一定不合法,直接返回
String exp ;
char c;
for (int i=0;i<len;i++){//先转整数,同时判断输入是否合法
exp= expArr[i];
c = exp.charAt(0);
if (i%2==0){
if (c=='t')arr[i]=1;
else if (c=='f')arr[i]=0;
else return 0;
}else{
if (c=='o')arr[i]=3;
else if (c=='a')arr[i]=2;
else return 0;
}
}
//处理and:把and先计算掉
for (int i=1;i<len-1;i+=2){
if (arr[i]==2){
if (arr[i-1]+arr[i+1]<2){
arr[i-1]=0;
arr[i+1]=0;
}
}
//这里其实可以优化,如果前面出现true,同时不影响后面的and就可以直接返回true了,不用后面的遍历判断
}
//存在一个true即返回true,因为现在只有or,一个true或上任何值都是true
for (int i=0;i<len;i+=2){
if (arr[i]==1)return 1;
}
return 2;
}
}