1. 程式人生 > 其它 >[每日一題]Leetcode227. 基本計算器 II

[每日一題]Leetcode227. 基本計算器 II

今天的每日一題是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).
在這裡插入圖片描述
參考資料
·力扣官方題解