[每日一題]Leetcode227. 基本計算器 II
阿新 • • 發佈:2021-03-13
今天的每日一題是Leetcode227. 基本計算器 II,題意如下:
給你一個字串表示式 s ,請你實現一個基本計算器來計算並返回它的值。
整數除法僅保留整數部分。
1 <= s.length <= 3 * 105
s 由整數和算符 (’+’, ‘-’, ‘*’, ‘/’) 組成,中間由一些空格隔開
s 表示一個 有效表示式
表示式中的所有整數都是非負整數,且在範圍 [0, 231 - 1] 內
題目資料保證答案是一個 32-bit 整數
這道題是昨天的進階版,但是這道題少了括號,多了乘法和除法。思路也很簡單,用一個棧儲存加法和減法的數(加法存正值,減法存負值),遇到乘除法先把乘除法和棧頂的元素計算之後再入棧,這樣就把乘除法全部先算完了,棧中只存在加減法,再遍歷一遍棧把所有數加起來就是最後的答案了。寫程式碼時注意判斷中的細節應該就問題不大。
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).
參考資料
·力扣官方題解