题解 | #四则运算#

四则运算

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

天晓得我经历了什么。。。没有算法基础,不懂那些,就是硬杠。。。懒得调整了,搞了快半天,不优化不抽取了。。
思想就是从当前输入串里直接搜索括号,搜第一个)和以这个)为结尾的子串的最后一个(,这样每次都是先从()算起,然后将结果扔到字符串里,重复循环就行。比如(a+b*(c+d)+f),首先搜索第一个),在d后面这个位置,然后截取字符串(a+b*(c+d,在这个新串里搜索最后一个(,这样得到了起始索引,然后遍历起始索引里的字符c+d,然后就是这趟循环里已经没有括号了,可以直接计算了,就不赘述了,计算完后得到一个数值,将该数值插入到起始位置对应的原始字符串里,就相当于把先算的()里的值给替换进去了,然后重复循环,直到字符串里没有操作符

import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        String a = str.replaceAll("\\[", "(")
                   .replaceAll("\\{", "(")
                   .replaceAll("\\]", ")")
                   .replaceAll("\\}", ")");
        StringBuilder sb = new StringBuilder(a);
        String b = sb.toString();
        //a+((b-c)*(d-b)-a)* e
        //a+a*(b+c/(a-b*(c-(d/a-1))))
        while (sb.length() > 0) {
            int endIndex = b.indexOf(")");
            int fromIndex = -1;
            if (endIndex != -1) {
                fromIndex = b.substring(0, endIndex + 1).lastIndexOf("(");
            } else {
                fromIndex = b.lastIndexOf("(");
            }
            StringBuilder num = new StringBuilder();
            char op = ' ';
            Stack<String> s = new Stack<>();
            if (fromIndex == -1 || endIndex == -1) {
                fromIndex = -1;
                endIndex = sb.length();
            }
            for (int i = fromIndex + 1; i < endIndex; i++) {
                char c = b.charAt(i);
                if (i == fromIndex + 1 && c == '-') {
                    num.append(c);
                } else if (Character.isDigit(c) && op == ' ') {
                    num.append(c);
                } else if (Character.isDigit(c) && op != ' ') {
                    num.append(c);
                    if (i == endIndex - 1) {
                        s.push(num.toString());
                        num = new StringBuilder();
                    }
                } else {
                    if (c == '-' && (b.charAt(i - 1) == '-' || b.charAt(i - 1) == '+' ||
                                     b.charAt(i - 1) == '*' || b.charAt(i - 1) == '/')) {

                        num.append(c);
                    } else {
                        s.push(num.toString());
                        num = new StringBuilder();
                        op = c;
                        s.push(String.valueOf(op));
                    }
                }
                //a + b * c
            }
            if (op == ' ') {
                System.out.println(b);
                return;
            }
            int result = cal(s);
            if (fromIndex == -1) {
                System.out.println(result);
                return;
            }
            sb.replace(fromIndex, endIndex + 1, "");
            sb.insert(fromIndex, result);
            b = sb.toString();
        }

    }

    static int cal(Stack<String> s) {
        //a + b * c *d + c
        String lft = null;
        String op = null;
        String rft = null;

        while (s.size() > 0) {
            String s1 = s.get(0);
            if (lft == null) {
                lft = s.remove(0);
            } else if (op == null) {
                op = s.remove(0);
            } else if (rft == null) {
                rft = s.remove(0);
                if (op.equals("*")) {
                    s.add(0, String.valueOf(Integer.parseInt(lft) * Integer.parseInt(rft)));
                    lft = null;
                    rft = null;
                    op = null;
                    if (s.size() == 1) {
                        break;
                    }
                } else if (op.equals("/")) {
                    s.add(0, String.valueOf(Integer.parseInt(lft) / Integer.parseInt(rft)));
                    lft = null;
                    rft = null;
                    op = null;
                    if (s.size() == 1) {
                        break;
                    }
                } else if (op.equals("+") || op.equals("-")) {
                    if (0 == s.size()) {
                        if (op.equals("+")) {
                            s.add(0, String.valueOf(Integer.parseInt(lft) + Integer.parseInt(rft)));
                        } else {
                            s.add(0, String.valueOf(Integer.parseInt(lft) - Integer.parseInt(rft)));
                        }
                        break;
                    } else {
                        String nextOp = s.get(0);
                        if (nextOp.equals("*")) {
                            nextOp = s.remove(0);
                            String nextRft = s.remove(0);
                            rft = String.valueOf(Integer.parseInt(rft) * Integer.parseInt(nextRft));
                            s.add(0, rft);
                            rft = null;
                        } else if (nextOp.equals("/")) {
                            nextOp = s.remove(0);
                            String nextRft = s.remove(0);
                            rft = String.valueOf(Integer.parseInt(rft) / Integer.parseInt(nextRft));
                            s.add(0, rft);
                            rft = null;
                        } else if (nextOp.equals("+") || nextOp.equals("-")) {
                            if (op.equals("+")) {
                                s.add(0, String.valueOf(Integer.parseInt(lft) + Integer.parseInt(rft)));
                            } else {
                                s.add(0, String.valueOf(Integer.parseInt(lft) - Integer.parseInt(rft)));
                            }

                            lft = null;
                            rft = null;
                            op = null;
                            if (s.size() == 1) {
                                break;
                            }
                        }
                    }

                }
            }
        }
        return Integer.parseInt(s.get(0));
    }
}

全部评论

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring&nbsp;boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring&nbsp;task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
03-19 10:07
已编辑
广东药科大学 golang
Yki_:你倒是进一个面啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务