• 美团校招-表达式求值


    题目描述

    给出一个布尔表达式的字符串,比如: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;
        }
    }
    
  • 相关阅读:
    Java StringBuffer 和 StringBuilder 类
    Java String 类
    Java Character 类
    windows server R2 搭建ftp服务
    虫师的使用经验
    Linux 使用NC命令监听本地端口
    MYSQL让别人远程访问自己的数据库
    crontab
    tomcat日志切割脚本
    测试分布式部署页面sso
  • 原文地址:https://www.cnblogs.com/XT-xutao/p/12629242.html
Copyright © 2020-2023  润新知