
題目解析:給定一個陣列代表一排小行星,正數代表往右飛,負數代表往左飛,數字的絕對值代表大小,當兩顆相遇時較小的會爆炸,如果一樣大就一起爆炸,找出全部碰撞完後剩下的結果
解題思路:先設一個雙向佇列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;
}
};

題目解析:給定一個有編碼規則的字串,規則是數字配上中括號,代表括號裡面的字串必須重複該數字的次數,最後把字串全部解碼並回傳
解題思路: 先設一個堆疊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;
}
};