牛客 检测命令是否正确

提取题意,考虑是正向判断还是反向判断比较关键.

命令只能由小写字母/AND/OR/NOT组成,不能有括号,不能由NOT开头且NOT不可以双否定.


import java.util.ArrayList;
import java.util.Scanner;
public class Test {
    public static void main(final String[] args) {
       Scanner sc = new Scanner(System.in);
       ArrayList<String> Orders = new ArrayList<>();
        // 得到所有多行输入
        while(sc.hasNextLine()){
            String l = sc.nextLine();
            // 底下这一行卡死多少英雄好汉:读到换行的空行,结束控制台读取
            Orders.add(l); 
            if( l.equals("") ) 
                break;// 这一行不会读到"\n"...
        }
        Test test = new Test();
        int t=0;
        while (t < Orders.size()) {
            // 对每一行进行判断
            String line = Orders.get(t++);
            // 命令如果是空行
            if(line.length() == 0 ){
                test.print(0);
            }else{
                String[] orders = line.split(" ");
                // 如果不是空行,对每一个元素进行判断(对语义进行判断)
                for(String tmp : orders){
                    if(test.isIllegalType(tmp))
                        break;
                }
                // 对语法规则判断
                if(test.isIllegalContent(orders))
                    test.print(1);
            }
        }
        sc.close();
    }
    public boolean isIllegalContent(String[] orders){
        // 是否用"NOT"开头
        if(orders[0].equals("NOT")){
            this.print(0);
            return false;
        }else{
            // 判断是否两个"NOT"连续
            for(int i=0;i<orders.length-1;i++)
                if(orders[i].equals("NOT") && orders[i+1].equals("NOT") ){
                    this.print(0);
                    return false;
                }
        }
        return true;
    }
    public boolean isIllegalType(String tmp){
        // 是否是小写字母
        if(tmp.length() == 1){
            if(!( tmp.charAt(0) >='a'&& tmp.charAt(0) <= 'z' )){
                this.print(0);
                return true;
            }
        }
        // 是否是"OR"
        else if(tmp.length() == 2){
            if(! tmp.equals("OR")){
                this.print(0);
                return true;
            }
        }
        // 是否是"AND"||"NOT"
        else if(tmp.length() == 3){
            if(!( tmp.equals("AND" )|| tmp.equals("NOT"))){
                this.print(0);
                return true;
            }
        }
        return false;
    }
    public void print(int i){
        if(i==0)
            System.out.println("0");
        else if (i==1)
            System.out.println("1");

    }

}import java.util.ArrayList;
import java.util.Scanner;
public class Test{
   public static void main(String[] args){
       Scanner sc = new Scanner(System.in);
       ArrayList<String> Orders = new ArrayList<String>();
       // 得到所有多行输入
       while(sc.hasNextLine()){
            String l = sc.nextLine();
            Orders.add(l);
             // 底下这一行卡死多少英雄好汉:读到换行的空行,结束控制台读取
            if(l.equals("")){
                break;
            }
       }
       Test test = new Test();
       // 从第0行开始
       int t =0;
       while( t < Orders.size()-1){
           // 对每一行进行判断
           String line = Orders.get(t++);
           System.out.println("line:  "+line);
           // 命令如果是空行
           if(line.length() == 0){
               test.print(0);
           }else{
               //以空格分割每个命令
                String[] orders = line.split(" ");
                boolean flag = true;
                // 如果不是空行,对每一个元素进行判断(对语义进行判断)
                for(String order : orders){
                   if(! test.isIllegalType(order)){
                        flag = false;
                        break;
                   }
                }
                // 对语法规则判断
                if(flag && test.isIllegalContent(orders))
                    test.print(1);
           }
       }
       sc.close();
   }
   public boolean isIllegalType(String order){
       if(order.length() == 1){
           // 不在小写字母范围不合法
           if(order.charAt(0) <'a'|| order.charAt(0) > 'z'){
               this.print(0);
               return false;
            //    不是OR命令不合法
           }else if(order.length() == 2){
               if(!order.equals("OR")){
                   this.print(0);
                   return false;
               }
            //    不是"AND"或者"NOT"命令不合法
           }else if(order.length()==3){
               if(!(order.equals("AND") || order.equals("NOT"))){
                   this.print(0);
                   return false;
               }
           }
       }
       return true;
   }
   public boolean isIllegalContent(String[] orders){
    //    以"NOT"开头不合法
       if(orders[0].equals("NOT")){
           this.print(0);
           return false;
       }else{
        //    出现连续"NOT"不合法
           for(int i = 0; i < orders.length-1;i++){
               if(orders[i].equals("NOT") && orders[i+1].equals("NOT")){
                   this.print(0);
                   return false;
               }
           }
       }
       return true;
   }
   public void print(int i) {
       switch(i){
           case 0:System.out.println("0");
           case 1:System.out.println("1");
       }
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值