每日一练 · 基本计算器 II

64 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

一、题目描述:

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

 

示例 1:

输入:s = "3+2*2" 输出:7 示例 2:

输入:s = " 3/2 " 输出:1 示例 3:

输入:s = " 3+5 / 2 " 输出:5  

提示:

1 <= s.length <= 3 * 105 s 由整数和算符 ('+', '-', '*', '/') 组成,中间由一些空格隔开 s 表示一个 有效表达式 表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内 题目数据保证答案是一个 32-bit 整数

二、思路分析:

将含有连续乘除法的部分当成一个整体,然后只需依次进行加减法运算即可。

1、用一个变量ans来累计结果,如果遇到一个数放进变量temp,如果遇到连续的乘除法则进行相应的运算更新temp。 2、需要一个preSign符号位来记录当前ans和temp之间的符号(+对应1,-对应-1)。 3、执行ans += preSign*temp累加操作。

三、AC 代码:

class Solution {
    public int calculate(String s) {
        int ans = 0;
        int preSign = 1;

        int n = s.length();
        int temp = 0;
        int sign = 1;

        // 整体思路,先计算乘除法,再计算加减法
        for (int i = 0; i < n; i++) {
            char c = s.charAt(i);
            if (c == '+') {
                // 结算前面的部分
                ans += preSign*temp;
                sign = 1;
                preSign = 1;
            } else if (c == '-') {
                // 结算前面的部分
                ans += preSign*temp;
                sign = -1;
                preSign = -1;
            } else if (c == '*') {
                sign = 2;
            } else if (c == '/') {
                sign = 3;
            } else if (Character.isDigit(c)) {
                int num = c - '0';
                while (i + 1 < n && Character.isDigit(c = s.charAt(i + 1))) {
                    num = num * 10 + c - '0';
                    i++;
                }
                // 乘除法优先级更高,遇到直接算
                if (sign == 2) {
                    temp *= num;
                } else if (sign == 3) {
                    temp /= num;
                } else {
                    temp = num;
                }
            }
        }
        ans += preSign*temp;
        return ans;
    }
}



四、总结:

image.png

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐

希望对你有帮助

期待下次再见~

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做