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).

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


參考資料
·力扣官方題解