iT邦幫忙

2026 iThome 鐵人賽

DAY 9
0
Software Development

30天刷完leetcoode75系列 第 9 篇

C++ 演算法練習 Day9|735, 394題解與思路分享

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20260923/20184265rY9vY3vIOC.png

題目解析:給定一個陣列代表一排小行星,正數代表往右飛,負數代表往左飛,數字的絕對值代表大小,當兩顆相遇時較小的會爆炸,如果一樣大就一起爆炸,找出全部碰撞完後剩下的結果
解題思路:先設一個雙向佇列v用來裝往右飛的小行星,還有一個陣列ans用來裝確定存活的。然後丟進迴圈開始跑,遇到大於0的就直接塞進v裡面,遇到小於0的就進迴圈跟v最後面往右飛的比大小。如果兩邊一樣大就一起抵消並跳出,如果往右飛的比較大就直接跳出,如果往左飛的比較大就把v最後面的拔掉繼續比。如果比到v空了而且自己沒有抵消掉,就把它加進ans裡面。最後再跑一個迴圈把v裡面剩下的正數全部塞進ans後面,最後回傳ans

class Solution {
public:
    vector<int> asteroidCollision(vector<int>& asteroids) {
        deque<int> v;
        vector<int> ans;

        for(auto it : asteroids){
            if(it > 0) v.push_back(it);
            else{
                while(!v.empty()){
                    if(abs(it) == v.back()){
                        it = 0;
                        v.pop_back();
                        break;
                    }else if(abs(it) < v.back()){
                        break;
                    }else v.pop_back();
                }

                if(v.empty() && it != 0) ans.push_back(it);
            }
        }

        while(!v.empty()){
            ans.push_back(v.front());
            v.pop_front();
        }

        return ans;
    }
};

https://ithelp.ithome.com.tw/upload/images/20260923/20184265AMi1kNJkmq.png

題目解析:給定一個有編碼規則的字串,規則是數字配上中括號,代表括號裡面的字串必須重複該數字的次數,最後把字串全部解碼並回傳
解題思路: 先設一個堆疊v來存之前的字串跟重複次數,再設一個空字串ans來記目前的字串,還有一個變數q來記次數。然後丟進迴圈開始跑,遇到數字就更新q,遇到左括號就把目前的ans跟q塞進堆疊裡面然後清空它們,遇到右括號就把堆疊最上面的字串跟次數拿出來,把目前的ans重複該次數後接在拿出來的字串後面變成新的ans,遇到一般字母就直接加進ans裡面,最後回傳ans

class Solution {
public:
    string decodeString(string s) {
        stack<pair<string, int>> v;
        string ans = "";
        int q = 0;

        for(int i=0; i<s.size(); i++){
            if(isdigit(s[i])){
                q = q * 10 + (s[i] - '0');
            }else if(s[i] == '['){
                v.push({ans, q});
                ans = "";
                q = 0;
            }else if(s[i] == ']'){
                string t = v.top().first;
                int k = v.top().second;
                v.pop();
                for(int j=0; j<k; j++){
                    t += ans;
                }
                ans = t;
            }else{
                ans += s[i];
            }
        }
        
        return ans;
    }
};

上一篇
C++ 演算法練習 Day8|1657 ,2352 ,2390題解與思路分享
下一篇
C++ 演算法練習 Day10|933, 649 題解與思路分享
系列文
30天刷完leetcoode75 共 11 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言