leetcode 字符串处理 --基本计算器 II --java版

先看题目:
在这里插入图片描述
第一感觉:
应该是分为各种情况去计算,加减乘除相关的计算。自己先写了一版,比较挫,感觉数字老是比运算符号慢一步

    public int calculate(String s) {
        int result = 0;
        Deque<Integer> stack = new LinkedList<>();
        stack.push(1);
        int numTemp = 0;
        for (int i = 0; i < s.length(); i++) {
            Character temp = s.charAt(i);
            if (s.charAt(i) == ' ') {
                continue;
            }
            int stackTemp = stack.peek();
            if (Character.isDigit(temp)) {
                numTemp = getNumericValue((int)temp);
            }
            switch (temp) {
                case '+':
                    stack.push(numTemp);
                    break;
                case '-':
                    stack.push(-numTemp);
                    break;
                case '*':
                    stack.push(numTemp * stack.pop());
                    break;
                case '/':
                    stack.push(stack.pop() /numTemp);
                    break;
            }
        }
        for (int i = 0; i < stack.size(); i++) {
            result +=  ((LinkedList<Integer>) stack).get(i);
        }
        return result;
    }

看了网上的解析,理解了原来是先要把数字计算出来,然后再把运算符号给加载进去。其中,初始化一个预置的符号是“+”。

    public int calculateSolvedFinally(String s) {
        int result = 0;
        char sgn = '+';
        int nums = 0;
        s = s.replace(" ", "");
        Deque<Integer> stack = new ArrayDeque<>();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == ' ') {
                continue;
            }
            if (Character.isDigit(s.charAt(i))) {
                nums = nums * 10 + s.charAt(i) - '0';
            }
            if(!(s.charAt(i) >= '0' && s.charAt(i) <= '9') || i == s.length() - 1){
                switch (sgn) {
                    case '+':
                        stack.push(nums);
                        break;
                    case '-':
                        stack.push(-nums);
                        break;
                    case '*':
                        stack.push(stack.pop() * nums);
                        break;
                    case '/':
                        stack.push(stack.pop() / nums);
                        break;
                }
                nums = 0;
                sgn = s.charAt(i);
            }
        }
        while (!stack.isEmpty()) {
            result += stack.pop();
        }
        return result;
    }

这里主要是说一下,自己遇到的几个坑吧:
第一:
在java中如何将string中的每一个字符转换成一个数字
google了一下,有两种办法,
第一种是通过s.charAt(i) - '0'这种方式,
第二种是通过numTemp = getNumericValue((int)temp),java的库函数。

第二:
为什么将nums定义为这种形式:

            if (Character.isDigit(s.charAt(i))) {
                nums = nums * 10 + s.charAt(i) - '0';
            }

nums的数字有可能是12, 200,等等,不一定是个位数,这个debug调试一下就了解了。

第三:
为什么if的判断条件中需要进行最后一位的判断?

if(!(s.charAt(i) >= '0' && s.charAt(i) <= '9') || i == s.length() - 1)

需要将最后一步的加减乘除加载进去。

第四:
为什么这样处理空格

s = s.replace(" ", "");

当没有进行这样处理时,出现最后一位是空格时,会少加一位,所以在一开始直接去掉了空格。这个可以debug调试一下。

对了,推荐一下这篇文章,解释的很好:

https://blog.youkuaiyun.com/h2453532874/article/details/89884504

在这里插入图片描述
好了,今天先到这里。
有问题欢迎留言交流~

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值