题解 | #四则运算#

四则运算

https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();

        System.out.println(func(replace(s)));
    }


    private static String replace(String s) {
        while (s.contains("[")) {
            s = s.replace('[', '(');
        }
        while (s.contains("]")) {
            s = s.replace(']', ')');
        }
        while (s.contains("{")) {
            s = s.replace('{', '(');
        }
        while (s.contains("}")) {
            s = s.replace('}', ')');
        }
        return s;
    }

    private static int func(String s) {
        try {
            return Integer.parseInt(s);
        } catch (Exception e) {
        }
        if (s.contains("(")) {
            return func(handleK(s));
        }
        return handleOp(s);
    }

    private static String handleK(String s) {
        int i = s.indexOf("(");
        int j = searchEndK(s, i);
        String sub = s.substring(i + 1, j);
        int v = func(sub);
        return subStr(s, i - 1, j + 1, v);
    }

    private static int searchEndK(String s, int i) {
        int count = 1;
        for (int j = i + 1; j < s.length(); j++) {
            char c = s.charAt(j);
            if (c == '(') {
                count++;
            } else if (c == ')') {
                count--;
                if (count == 0) {
                    return j;
                }
            }
        }
        return -1;
    }

    private static String subStr(String s, int i, int j, int v) {
        String left = i >= 0 ? s.substring(0, i + 1) : "";
        String right = j < s.length() ? s.substring(j) : "";
        return left + v + right;
    }

    private static int handleOp(String s) {
        Stack<Integer> num = new Stack<>();
        Stack<Character> op = new Stack<>();
        for (int i = 0; i < s.length();) {
            char c = s.charAt(i);
            i = handleNum(s, i, num);
            if (i >= s.length()) {
                break;
            }
            i = handleMult(s, i, num, op);
            if (i >= s.length()) {
                break;
            }
            i = handleAdd(s, i, num, op);
            if (i >= s.length()) {
                break;
            }
        }
        int sum = num.get(0);
        for (int i = 0, j = 1; i < op.size() && j < num.size(); i++, j++) {
            char c = op.get(i);
            int a = num.get(j);
            sum = val(a, sum, c);
        }
        return sum;
    }

    private static int handleNum(String s, int i, Stack<Integer> num) {
        int ii = handleNum1(s, i, num);
        if (ii > i) {
            return ii;
        }
        return handleNum2(s, i, num);
    }

    private static int handleNum1(String s, int i, Stack<Integer> num) {
        char c = s.charAt(i);
        // 数字
        if (!Character.isDigit(c)) {
            return i;
        }
        // 数字的开始
        StringBuilder sb = new StringBuilder();
        while (Character.isDigit(c)) {
            sb.append(c);
            i++;
            if (i >= s.length()) {
                break;
            }
            c = s.charAt(i);
        }
        int n = Integer.parseInt(sb.toString());
        num.push(n);
        return i;
    }

    private static int handleNum2(String s, int i, Stack<Integer> num) {
        char c = s.charAt(i);
        char pre = i > 0 ? s.charAt(i - 1) : '-';
        // 数字
        // 负号,前面不是数字则为负号
        if (c != '-' || Character.isDigit(pre)) {
            return i;
        }
        // 数字的开始
        StringBuilder sb = new StringBuilder();
        sb.append(c);
        i++;
        c = s.charAt(i);
        while (Character.isDigit(c)) {
            sb.append(c);
            i++;
            if (i >= s.length()) {
                break;
            }
            c = s.charAt(i);
        }
        int n = Integer.parseInt( sb.toString());
        num.push(n);
        return i;
    }

    private static int handleMult(String s, int i, Stack<Integer> num,
                                  Stack<Character> op) {
        char c = s.charAt(i);
        if (c != '*' && c != '/') {
            return i;
        }
        i++;
        int ii = handleNum(s, i, num);
        int a = num.pop();
        int b = num.pop();
        int v = val(a, b, c);
        num.push(v);
        return ii;
    }

    private static int handleAdd(String s, int i, Stack<Integer> num,
                                 Stack<Character> op) {
        char c = s.charAt(i);
        if (c != '+' && c != '-') {
            return i;
        }
        i++;
        op.push(c);
        return handleNum(s, i, num);
    }

    private static int val(int a, int b, char c) {
        int v;
        if (c == '*') {
            v = b * a;
        } else if (c == '/') {
            v = b / a;
        } else if (c == '+') {
            v = b + a;
        } else {
            v = b - a;
        }
        return v;
    }
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务