题解 | #表达式求值#

表达式求值

https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String input = in.next();
        //先计算小括号->中括号->大括号
        //先计算*/ 再计算+-
        System.out.println(substring(input));
    }

    //按顺序去除括号
    private static String substring(String s) {
        //寻找小括号,注意倒序查找
        int i1 = -1;
        int i2 = s.indexOf(")");
        if (i2 != -1) {
            for (int i = i2 - 1; i >= 0; i--) {
                if (s.charAt(i) == '(') {
                    i1 = i;
                    break;
                }
            }
        }
        if (i1 != -1) {
            i2 = s.indexOf(")");
            String substring = s.substring(i1 + 1, i2);
            s = s.substring(0, i1) + simplify(substring) + s.substring(i2 + 1);
            s = substring(s);
        }
        //寻找中括号
        i1 = s.indexOf("[");
        if (i1 != -1) {
            i2 = s.indexOf("]");
            String substring = s.substring(i1 + 1, i2);
            s = s.substring(0, i1) + simplify(substring) + s.substring(i2 + 1);
            s = substring(s);
        }
        //寻找大括号
        i1 = s.indexOf("{");
        if (i1 != -1) {
            i2 = s.indexOf("}");
            String substring = s.substring(i1 + 1, i2);
            s = s.substring(0, i1) + simplify(substring) + s.substring(i2 + 1);
            s = substring(s);
        }
        //没有括号了
        return simplify(s);
    }

    //括号内计算
    private static String simplify(String s) {
        //先查找*/
        int i1 = s.indexOf("*");
        int i2 = s.indexOf("/");
        int index = (i1 != -1 && i2 != -1) ? Math.min(i1, i2) : Math.max(i1, i2);
        if (index != -1) {
            return extracted(s, index);
        }
        //再查找+-
        i1 = s.indexOf("+");
        if (s.indexOf("-") == 0) {//排除负号
            int indexOf = s.substring(1).indexOf("-");
            i2 = indexOf == -1 ? -1 : indexOf + 1;
        } else {
            i2 = s.indexOf("-");
        }
        index = (i1 != -1 && i2 != -1) ? Math.min(i1, i2) : Math.max(i1, i2);
        if (index != -1) {
            return extracted(s, index);
        }
        return s;
    }

    private static String extracted(String s, int index) {
        int index2 = -1;//上一个非运算符位置
        for (int i = index - 1; i > 0; i--) {
            if (s.charAt(i) > '9' || s.charAt(i) < '0') {
                index2 = i;
                break;
            }
        }
        int index3 = s.length();//下一个非运算符位置
        for (int i = index + 2; i < s.length(); i++) {//注意负号
            if (s.charAt(i) > '9' || s.charAt(i) < '0') {
                index3 = i;
                break;
            }
        }
        //截取可运行部分
        String s2 = compute(s.substring(index2 + 1, index3));
        String s1 = index2 == -1 ? "" : s.substring(0, index2 + 1);
        String s3 = s.substring(index3);
        s = s1 + s2 + s3;
        return simplify(s);
    }

    private static String compute(String s) {
        //找到第一个运算符位置
        int index = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) > '9' || s.charAt(i) < '0') {
                if (i != 0) {//排除负号
                    index = i;
                    break;
                }
            }
        }
        //获得运算符合数字
        int result = 0;
        int i = Integer.parseInt(s.substring(0, index));
        int j = Integer.parseInt(s.substring(index + 1));
        char c = s.charAt(index);
        switch (c) {
            case '+':
                result = i + j;
                break;
            case '-':
                result = i - j;
                break;
            case '*':
                result = i * j;
                break;
            case '/':
                result = i / j;
                break;
        }
        return String.valueOf(result);
    }
}

解题思路:

1, 和第50题一样, 先计算括号内的部分, 计算时注意先乘除后加减, 同时还要注意分辨负号

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务