今天的每日一题是Leetcode227. 基本计算器 II,题意如下:
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
1 <= s.length <= 3 * 105
s 由整数和算符 (’+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开
s 表示一个 有效表达式
表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
题目数据保证答案是一个 32-bit 整数
这道题是昨天的进阶版,但是这道题少了括号,多了乘法和除法。思路也很简单,用一个栈存储加法和减法的数(加法存正值,减法存负值),遇到乘除法先把乘除法和栈顶的元素计算之后再入栈,这样就把乘除法全部先算完了,栈中只存在加减法,再遍历一遍栈把所有数加起来就是最后的答案了。写代码时注意判断中的细节应该就问题不大。
c++参考代码:
class Solution {
public:
int calculate(string s) {
stack<int> st;
int n=s.size();
char sign='+';
int now=0;
st.push(0);
for(int i=0;i<n;i++)
{
if(s[i]>='0'&&s[i]<='9')
{
now=now*10+(s[i]-'0');
}
if(!(s[i]>='0'&&s[i]<='9')&&s[i]!=' '||i==n-1)
{
if(sign=='+')
st.push(now);
else if(sign=='-')
st.push(-1*now);
else if(sign=='*')
{
int num=st.top()*now;
st.pop();
st.push(num);
}
else if(sign=='/')
{
int num=st.top()/now;
st.pop();
st.push(num);
}
sign=s[i];
now=0;
}
}
int ans=0;
while(!st.empty())
{
ans+=st.top();
st.pop();
}
return ans;
}
};
时间复杂度:O(N).
参考资料
·力扣官方题解