1 題目描述
提取字符串中的最長合法簡單數學表達式子串,字符串長度最長的,并計算表達式的值,如果沒有返回0。簡單數學表達式只能包含以下內容0-9 數字,符號±*
說明:
1.所有數字,計算結果都不超過 long
2.如果有多個長度一樣的,請返回第一個表達式的結果
3.數學表達式,必須是最長的,合法的
4.操作符不能連續出現,如 ±-+1 是不合法的
輸入
字符串
輸出
表達式值
示例一
輸入: 1-2abcd
輸出: -1
示例二
輸入: 1-2abs1-2*3+7dd4-5+6
輸出: 2
示例三
輸入: a1/0+8d
輸出: 8
2、審題
這道題有點難度,有以下幾個難點:
1、如何找出字符串中的最長合法數學表達式子串?
2、如何計算該數學表達式子串的值?
3、四則運算有一種特殊情況,除數不為零,這種也必須考慮。
上述三個問題的對應解法:
1、用正則表達式篩選表達式。
2、用遞歸方法計算,主要優勢代碼簡潔。
3、解法
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String str = scanner.nextLine();String longStr = dealWith(str); //找到最長合法數學表達式子串if (!longStr.isEmpty()) {int result = calculate(longStr);System.out.println(result);} else {System.out.println(0);}}//判斷字符串是否只有數字private static boolean isNumber(String str) {for (int i = 0; i < str.length(); i++) {if (!Character.isDigit(str.charAt(i))) {return false;}}return true;}//利用遞歸方法計算四則運算,這里+和-放在前面是有特殊原因,因為加法和減法的優先級低于乘法和除法private static int calculate(String str) {if (isNumber(str)) {return Integer.parseInt(str);}if (str.contains("+")) {int index = str.indexOf("+");return calculate(str.substring(0, index)) + calculate(str.substring(index + 1));}if (str.contains("-")) {int index = str.indexOf("-");return calculate(str.substring(0, index)) - calculate(str.substring(index + 1));}if (str.contains("*")) {int index = str.indexOf("*");return calculate(str.substring(0, index)) * calculate(str.substring(index + 1));}if (str.contains("/")) {int index = str.indexOf("/");return calculate(str.substring(0, index)) / calculate(str.substring(index + 1));}return 0;}//借助正則表達式拆出符合要求的表達式private static String dealWith(String str) {//將除數等于0時,表達式就不是合法的數學表達式,所以可以簡單地用a0給替換,注意string是不可變量,所以要用新的變量代替String replaceStr = str.replace("/0", "a0");int max = 0;String longStr = "";String regex = "\\d+([\\+\\-*/]\\d+)+"; //這個正則表達式的意思:尋找以數字開頭,+-*/其中之一緊隨其后,而后又是一個數字的一個或者多個模式Pattern pattern= Pattern.compile(regex);Matcher matcher = pattern.matcher(replaceStr);while (matcher.find()) {String group = matcher.group();if (group.length() > max) {max = group.length();longStr = group;}}return longStr;}
}
網上很多要付費才能看到。