乐元素笔试题-数学公式

   输出:0

示例2

  输入:"a+bc"

  输出:1

示例3:    

   输入:"()"

  输出:2

示例4

  输入:"(a+b]"

  输出:3

 

 

思路

  • 将数学公式的字符串,分为运算表达式 与 括号字符串;

  • 分别判断 运算表达式是否合法,是否缺少变量、运算符;

  • 以及 括号字符换是否匹配。

import java.util.Stack;

class Solution {
    public int getIlegalReason(String formula){
        String s1 = ""; //记录无括号的公式表达式
        String s2 = ""; //记录括号的字符串
        for(int i = 0; i < formula.length(); i++){
            char c = formula.charAt(i);
            if(c == '(' || c == ')' ||  c == '[' || c== ']' || c == '{' || c == '}') s2 += c;
            else s1 += c; // 分别取出运算表达式的字符串,及 括号匹配字符串
        }
        int res = function(s1);
        boolean flag = isValid(s2);
        if(flag == false) return 3;
        return res;
    }
    public int function(String s){ //判断公式表达式,是否合法
        if(s.length() == 0) return 2;
        for(int i = 1; i < s.length(); i++){
            char c = s.charAt(i);
            if(c == '+' || c == '-' || c == '*' || c == '/'){ //当前字符为运算符
                if(s.charAt(i-1) >= 'a' && s.charAt(i-1) <= 'z') continue;
                else return 2; //前一个也是运算符,缺少变量,返回 2
            }
            else{ //当前字符为变量
                if(s.charAt(i-1) >= 'a' && s.charAt(i-1) <= 'z') return 1;//前一个也是变量,缺少运算符,返回1
                else continue;
            }
        }
        return 0;
    }

    public boolean isValid(String s) { //判断括号是否匹配
        if(s.length() == 0) return true;
        Stack<Character> stack = new Stack<>();
        for(int i = 0; i < s.length(); i++){
            char c = s.charAt(i);
            if(c == '(' || c == '[' || c == '{') stack.push(c); //入栈
            else{
                if(stack.size() == 0) return false;//判栈空,栈非空才能有元素出栈
                char top = stack.pop();//出栈
                if(c == ')' && top == '(') continue;//判断能否配对
                else if(c == ']' && top == '[') continue;
                else if(c == '}' && top == '{') continue;
                else return false; //都不能配对成功,则返回 false
            }
        }
        if(stack.size() > 0) return false;
        return true;
    }
}

 结果:提交 OJ,显示 AC.

posted @ 2020-10-22 21:23  星海寻梦233  阅读(342)  评论(0编辑  收藏  举报