乐元素笔试题-数学公式
输出: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.