题解 | #牛牛计算器#

牛牛计算器

https://www.nowcoder.com/practice/192ac31d5e054abcaa10b72d9b01cace?tpId=354&tqId=10590517&ru=/exam/oj&qru=/ta/interview-202-top/question-ranking&sourceUrl=%2Fexam%2Foj

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @return int整型
     */
    public int calculate (String s) {
        // write code here
        Stack<Integer> stack = new Stack<Integer>();
        int num = 0;
        char operation = '+';
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (!Character.isWhitespace(c)) {

                if (c >= '0' && c <= '9') {
                    num = num * 10 + c - '0';
                } else if (c == '(') {
                    int j = i, cnt = 0;
                    for (; i < s.length(); i++) {
                        if (s.charAt(i) == '(')
                            cnt++;
                        if (s.charAt(i) == ')')
                            cnt--;
                        if (cnt == 0) {
                            break;
                        }
                    }
                    num = calculate(s.substring(j + 1, i));
                } else {
                    // 遇到符号了
                    if (operation == '+') {
                        stack.push(num);
                    } else if (operation == '-') {
                        stack.push(-num);
                    } else if (operation == '*') {
                        int tmp  = stack.pop() * num;
                        stack.push(tmp);
                    }
                    num = 0;
                    operation = c;
                }
                if (i == s.length() - 1) {
                    // 到达了计算的额字符串的末尾,将最后一个数字压入栈中
                    if (operation == '+') {
                        stack.push(num);
                    } else if (operation == '-') {
                        stack.push(-num);
                    } else if (operation == '*') {
                        int tmp  = stack.pop() * num;
                        stack.push(tmp);
                    }
                }
            } else {
                if (i == s.length() - 1) {
                    // 到达了计算的额字符串的末尾,将最后一个数字压入栈中
                    if (operation == '+') {
                        stack.push(num);
                    } else if (operation == '-') {
                        stack.push(-num);
                    } else if (operation == '*') {
                        int tmp  = stack.pop() * num;
                        stack.push(tmp);
                    }
                }
            }
        }
        int result = 0;
        while (!stack.isEmpty()) {
            result += stack.pop();
        }
        return result;
    }
    // " 3 - 2 * 4 "
    // -5
    // "(((((((((1+2)*3)+4)*5)+6)*7)+8)*9)+10)"
    //  4555
}

在表达式有效的前提下,计算字符串表达式的值

在刚开始取到的字符一定是数字或左括号之中的一种情况。

我们先讨论是数字的情况,如果开始的是数字字符,继续向后寻找,如果找到的还是数字,将前面的数字乘以10加上本次找到的数字,一直遇到数字就一直往下加拼凑,直到遇到符号或括号(说明本次数字找完整了),根据上一个遇到的符号把数字添加到栈中,

  • 如果上一个是加号,直接加入到栈中,
  • 如果上一个是减号,把其相反数放入栈中(旨在最后做出一个全是加法的表达),
  • 如果上一个是乘号,那么把栈顶元素弹出和本次相乘再加到栈中(旨在最后做出一个全是加法的表达)

最后把上一个操作符更新为本次的操作符,继续往下执行。

在末尾,处理栈中所有的元素,全部相加就是最后的结果

如果遇到的是括号,找到下一个成对的括号,然后把这段表达式放到函数中递归。

#java##栈##字符串匹配(正则表达式)#
全部评论

相关推荐

迷茫的大四🐶:💐孝子启动失败,改为启动咏鹅
点赞 评论 收藏
分享
10-19 10:28
已编辑
成都理工大学 后端工程师
团孝子已上线feeling:面了很多家公司,能感受到目前只有小公司+外包喜欢问八股。大厂虽然也问八股,但是是从实习、项目中进行提问,并且大厂会问很深,面试官也会对你的回答进行思考➕追问,所以准备大厂面试前一定要备好相关资料。对于算法,我做的是codetop前100+力扣hot100+力扣高频150,面试中实感hot100就足够,基本上只要是hot100就秒答。对于项目和八股,我做的也是烂大街的星球项目,八股则是看小林和问ai,自己也写了很多技术博客和画了很多思维导图,并且自己也尝试用嘴巴说出来,不只停留于纸面。运气也很重要,必须要让面试官/HR看到简历才行,所以建议投递时间是下午两点。tl:第一岗位9.9&nbsp;投递9.10&nbsp;一面(一面评价:最近见过最强的大三,结束五分钟后约二面,都晚上九点了不下班吗)9.11&nbsp;二面(三道算法a出两道,反问评价:经验不够等横向,我实习生要啥经验)9.21挂(实习时间过短+其他原因,想要一年实习的,为什么不招个正职)第二岗位10.10投递10.11约面(主管打电话,说看到我之前投递记录了想要我挂qa职进去干后端,同意)10.14&nbsp;一面(无八股,主动说确实很强,意愿很强)10.16&nbsp;oc其余,友邦,东软,东华,惠择,用友oc已拒京东测开一面挂(投后端被测开捞)腾讯测试已拒(投后端被测开捞)ps:表扬惠择的主管面,没怎么问技术(可能是一面面试官沟通过了),全程一起讲大道理,解答了心中很多疑惑,也告诉我以面试官角度来看怎么选候选人,如果可以下次一定选惠择
HeaoDng:美团好像可以触发一面通
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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