题解 | #四则运算#

四则运算

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

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        int res = calculate(str);
        System.out.println(res);
    }
  
    public static int calculate(String s) {
        s = s.replaceAll("\\{", "(");
        s = s.replaceAll("\\}", ")");
        s = s.replaceAll("\\[", "(");
        s = s.replaceAll("\\]", ")");
        s = s.replaceAll("--", "+");
        s = s.replaceAll("\\+-", "-");
        s = s.replaceAll("-\\+", "-");
        s = s.replaceAll("\\+\\+", "+");
        int start = -1, end = -1;
        if (s.contains("+") || s.contains("-") || s.contains("*") || s.contains("/") ||
                s.contains("(") || s.contains(")")) {
            //计算小括号,先找出第一个左括号(的位置,再找出其对应的右括号)
            //然后截取括号中间部分的字符串进行递归运算,将所得结果再插入原式替代原来的括号
            start = s.indexOf("(");
            int temp = 0;
            for (int i = start + 1; i < s.length(); i++) {
                if (s.charAt(i) == '(') {
                    temp++;
                }
                if (s.charAt(i) == ')') {
                    if (temp == 0) {
                        end = i;
                        break;
                    } else {
                        temp--;
                    }
                }
            }
            if (start != -1 && end != -1) {
                int res = calculate(s.substring(start + 1, end));
                return calculate(s.substring(0,start) + String.valueOf(res) + s.substring(end + 1));
            }

            //计算乘法,确定乘号*左右两边的乘数在字符串中的位置,再切割出乘数a、b
            int x = s.indexOf("*");
            if (x != -1) {
                int m = x - 1, n = x + 1;
                if (s.charAt(x + 1) == '-' || s.charAt(x + 1) == '+') n = x + 2;
                while (m >= 0 && Character.isDigit(s.charAt(m))) {
                    m--;
                }
                while (n < s.length() && Character.isDigit(s.charAt(n))) {
                    n++;
                }
                int a = Integer.parseInt(s.substring(m + 1, x));
                int b = Integer.parseInt(s.substring(x + 1, n));
                int res = a * b;
                return calculate(s.substring(0, m + 1) + String.valueOf(res) + s.substring(n));
            }

            //计算除法,确定除号/左右两边的除数与被除数在字符串中的位置,再切割出除数与被除数a、b
            int y = s.indexOf("/");
            if (y != -1) {
                int m = y - 1, n = y + 1;
                if (s.charAt(y + 1) == '-' || s.charAt(y + 1) == '+') n = y + 2;
                while (m >= 0 && Character.isDigit(s.charAt(m))) {
                    m--;
                }
                while (n < s.length() && Character.isDigit(s.charAt(n))) {
                    n++;
                }
                int a = Integer.parseInt(s.substring(m + 1, y));
                int b = Integer.parseInt(s.substring(y + 1, n));
                int res = a / b;
                return calculate(s.substring(0, m + 1) + String.valueOf(res) + s.substring(n));

            }

            //计算加减法,分别用正负号和数字分割字符串,得出数字数组与符号数组,以便进行计算
            //应分为两种情况:2+3(数字在前)、-2-3(正负号在前)
            int sum;
            String[] digitArr = s.split("[+-]");
            String[] charArr = s.split("[0-9]+");
            if (s.charAt(0) == '+' || s.charAt(0) == '-') {
                sum = 0;
                for (int i = 0; i < charArr.length; i++) {
                    if ("-".equals(charArr[i])) {
                        sum = sum - Integer.parseInt(digitArr[i + 1]);
                    } else if ("+".equals(charArr[i])) {
                        sum = sum + Integer.parseInt(digitArr[i + 1]);
                    }
                }
            } else {
                sum = Integer.parseInt(digitArr[0]);
                for (int i = 1; i < charArr.length; i++) {
                    if ("-".equals(charArr[i])) {
                        sum = sum - Integer.parseInt(digitArr[i]);
                    } else if ("+".equals(charArr[i])) {
                        sum = sum + Integer.parseInt(digitArr[i]);
                    }
                }
            }
            return sum;
        }
        //若没有符号,只有数字,则直接转为数字返回
        return Integer.parseInt(s);
    }
}

全部评论

相关推荐

点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-20 16:14
已编辑
不止遇到一次了,什么都不会,让提合并请求,问什么是合并请求。让gitlab.页面把测试截图附上,不知道截图要放在哪,那么大的编辑看不到吗让配开发机,问ip是什么东西……这都咋进来的啊,我们(我2023年毕业)那会儿没AI的时候面试都是直接linux,docker,k8s,git,结构与算法,计网。怎么才过去2年,实习生跟傻子一样,有些问题问的我难受,不会git&nbsp;commit,不会git&nbsp;pull,不会切换分支,直接要覆盖master....————而且态度非常敷衍,3天前给开个仓库权限,连本地都没有拉下来。让写一个小文档,都是说一句,写一句,说把目录加上,挺嗤之以鼻,最后还是把目录加上了😂😂任何文档和注释都是方便后来人的,现在的人真的很自负啊,打开github看看任何一个开源项目的文档和注释,都写的很详细。难道现在的同学在校期间不经常拉开源项目看源码学习吗?&nbsp;哪怕是一个swap函数,开源项目里都经常注释:1&nbsp;3&nbsp;5&nbsp;7&nbsp;9&nbsp;2&nbsp;4&nbsp;6&nbsp;8&nbsp;10^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rswap:{功能描述}{使用样例}————给我气笑了,没次问我有什么任务的时候,我都是说,优先你学校导师的项目,然后再做公司需求。然后给了两个需求,一个月内搞定就行,既然是agent开发,1.&nbsp;部署需要维护项目的开发环境2.阅读opencode/openclaude代码(我个人感觉龙虾的源码agent部分很常规,就一个channel+agent,还不如看claude泄露的代码和opencode)然后任务1搞了几周说因为环境问题,他申请到的远程开发机是linux,装的python2,项目是py3的,所以没搭建,我说你不行就用conda或docker把环境屏蔽了呢,没搭理我。任务2:看了很长时间代码,给我回了一句,opencode和openclaude是用go写的……我说你打开github看右下角那的语言是ts还是go……&nbsp;结果满脸懵的说ts是什么……我让看agent&nbsp;loop,哪怕全局搜索一下while(true),跳过去从头看到尾就大致清楚了,压根没看。————嘻嘻,我已经开始做社招简历了。
redf1sh:默认会git结果发现真不会,这种一看就是没做过项目的,真做过项目的至少会提交
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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