持续创作,加速成长!这是我参与「掘金日新计划 · 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;
}
}
四、总结:
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐
希望对你有帮助
期待下次再见~
🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做