题解 | #四则运算#
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
import java.awt.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.math.BigDecimal; import java.util.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); String input; while ((input = read.readLine()) != null) { System.out.println(getResultResult(input)); } } static ArrayList<String> list = new ArrayList<String>() { { add("("); add(")"); add("["); add("]"); add("{"); add("}"); add("+"); add("-"); add("*"); add("/"); } }; static int[] temp = new int[2]; public static String getResultResult(String str) { if (str.contains("(")) { str = handleBrackets(str, "(", ")"); } if (str.contains("[")) { str = handleBrackets(str, "[", "]"); } if (str.contains("{")) { str = handleBrackets(str, "{", "}"); } if (str.contains("*")) { str = getArrayMul(str, "*"); } if (str.contains("/")) { str = getArrayMul(str, "/"); } if (isNumberLessChar(str)) { str = str.replace("--", "+"); } if (str.contains("-")) { str = str.replace("-", "+-"); } if (str.contains("+")) { String[] split = str.split("\\+"); if (split.length < 2) return str; int res = 0; split = Arrays.stream(split).filter(s -> !Objects.equals(s, "")).toArray(String[]::new); for ( int i = 0; i < split.length - 1; i++) { res = Integer.parseInt(split[i]) + Integer.parseInt(split[i + 1]); split[i + 1] = res + ""; } if (split.length == 1) { res = Integer.parseInt(split[0]); } return res + ""; } return str; } private static String getArrayMul(String str, String brackets) { int[] array = new int[2]; while (isContainsList(str) && str.contains(brackets)) { int indexOf = str.indexOf(brackets); for (int i = indexOf + 1; i < str.length(); i++) { if ((str.charAt(i - 1) + "").equals(brackets) && str.charAt(i) == '-')continue; if (i == str.length() - 1) { array[1] = Integer.parseInt(str.substring(indexOf + 1)); temp[1] = i + 1; break; } if (list.contains(str.charAt(i) + "")) { array[1] = Integer.parseInt(str.substring(indexOf + 1, i)); temp[1] = i; break; } } for (int i = indexOf - 1; i >= 0; i--) { if (list.contains(str.charAt(i) + "")) { array[0] = Integer.parseInt(str.substring(i + 1, indexOf)); temp[0] = i + 1; break; } if (i == 0) { array[0] = Integer.parseInt(str.substring(0, indexOf)); temp[0] = i; break; } } BigDecimal res; if (brackets.equals("*")) { res = BigDecimal.valueOf((long) array[0] * array[1]); } else { res = BigDecimal.valueOf(array[0] / array[1]); } String substring = str.substring(temp[0], temp[1]); str = str.replace(substring, res + ""); } return str; } public static Boolean isContainsList(String string) { for (String s : list) { if (string.contains(s)) { return true; } } return false; } public static String handleBrackets(String str, String brackets, String brackets2) { //TODO ()()和(())根据栈拿下标 while (isContainsList(str) && str.contains(brackets2)) { int[] indexOf = getIndexOfBrackets(str, brackets, brackets2); /* int indexOf_first = str.indexOf(brackets); int indexOf_second = str.lastIndexOf(brackets2);*/ int indexOf_first = indexOf[0]; int indexOf_second = indexOf[1]; String substring = str.substring(indexOf_first + 1, indexOf_second); String resultResult = getResultResult(substring); str = str.replace(brackets + substring + brackets2, resultResult); } return str; } private static int[] getIndexOfBrackets(String str, String brackets, String brackets2) { int[] index = new int[2]; boolean b = true; Stack<Character> stack = new Stack<>(); for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == brackets.charAt(0)) { stack.push(str.charAt(i)); if (b) { index[0] = i; b = !b; } continue; } if (str.charAt(i) != brackets2.charAt(0)) { continue; } if (!stack.isEmpty() && stack.peek() == brackets.charAt(0) && str.charAt(i) == brackets2.charAt(0)) { stack.pop(); } if (stack.isEmpty() && !b) { index[1] = i; break; } } return index; } public static Boolean isNumberLessChar(String str) { int charNumber = 0; int number = 0; String[] splitDeduce = str.split("-"); for (String s : splitDeduce) { if (s.contains("\\+")) { number = number + s.split("\\+").length; } else if (s.isEmpty()) { } else { number++; } } for (int i = 0; i < str.length(); i++) { if (list.contains(str.substring(i, i + 1))) { charNumber++; } } return charNumber >= number; } }