题解 | #四则运算#

四则运算

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

import java.util.Scanner;

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, 需要注意四则运算的规则, 先计算括号内, 再计算括号外的部分;

2,括号内先计算乘除法, 再处理加减法;

3, 读取运算符时注意避开负号

全部评论

相关推荐

2025-12-19 15:04
门头沟学院 Java
小肥罗:hr爱上你了,你负责吗哈哈
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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