提取字符串中的最长合法简单数学表达式,字符串长度最长的,并计算表达式的值。如果没有,则返回0
* 简单数学表达式只能包含以下内容
* 0-9数字,符号+-*
* 说明:
* 1.所有数字,计算结果都不超过long
* 2.如果有多个长度一样的,请返回第一个表达式的结果
* 3.数学表达式,必须是最长的,合法的
* 4.操作符不能连续出现,如+--+1是不合法的
*
* 输入描述:
* 字符串<
* 输出描述:
* 表达式值
*
* 例如:输入1-2abcd 输出-1
public class HuaWei4EvaluateExpression {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String input = scan.nextLine();
long resutl = evaluateExpression(input);
System.out.println(resutl);
}
private static long evaluateExpression(String input){
// 记录位置和最大长度
int maxLoc = 0, maxLen = 0;
int loc = 0, len = 0;
if (input.length() <= 0) {
return 0;
}
if (input.length() == 1) {
// 判断是否为数字
if(Character.isDigit(input.charAt(0))) {
return Long.parseLong(input);
} else {
return 0;
}
}
for (int i = 1; i < input.length(); i++){
// 当前位为符号,判断前一位是否为数字
if(isOperator(input.charAt(i))){
if(Character.isDigit(input.charAt(i-1))){
len++;
} else {
loc = i;
}
}
// 当前位为数字
else if (Character.isDigit(input.charAt(i))) {
if(Character.isDigit(input.charAt(i-1)) || isOperator(input.charAt(i-1))) {
len++;
} else {
len = 1;
loc = i;
}
}
// 当前位为其他不符合字符
else {
if (len > maxLen) {
maxLoc = loc;
maxLen = len;
}
loc = i;
len = 0;
}
}
// 获取最长表达式并计算
String maxS = input.substring(maxLoc, maxLoc+maxLen);
long result = compute(maxS);
return result;
}
private static long compute(String s){
String[] tockens = s.split("(?<=[-+*])|(?=[-+*])");
long result = Long.parseLong(tockens[0]);
for (int i = 1; i < tockens.length; i+=2) {
char operator = tockens[i].charAt(0);
long operand = Long.parseLong(tockens[i+1]);
switch (operator) {
case '+':
result += operand;
break;
case '-':
result -= operand;
break;
case '*':
result *= operand;
break;
}
}
return result;
}
private static boolean isOperator(char a) {
if(a == '+' || a == '-' || a == '*'){
return true;
}
return false;
}
}