2390.Remover asteriscos das strings
Idéia: adicione elementos à pilha e exiba diretamente o elemento superior da pilha ao encontrar o sinal *.
class Solution {
public:
string removeStars(string s) {
stack<char>st;
for(int i=0;i<s.size();i++){//字符加入栈,遇到星号弹出栈
if(s[i]!='*') st.push(s[i]);
else st.pop();
}
int n=st.size();
for(int i=n-1;i>=0;i--){//把栈中元素倒序赋值给s
char mid=st.top();
s[i]=mid;
st.pop();
}
return s.substr(0,n);//截取s的结果部分
}
};
735. Colisão de asteroides
Análise: Dois planetas colidirão apenas quando o lado esquerdo for para a direita e o lado direito for para a esquerda.
Ideia 1: Use vetor para simular a pilha
Atravesse a matriz, quando dois planetas colidem
- 1. Dois planetas são iguais: o topo da pilha aparece
- 2. O elemento no topo da pilha é grande: pule
- 3. O elemento no topo da pilha é pequeno: o topo da pilha aparece, o planeta atravessado atual sobrevive e a situação no próximo topo da pilha precisa ser determinada.
Portanto, quando o elemento superior da pilha é pequeno, o planeta atualmente atravessado pode sobreviver, então o registro da variável bool é introduzido.
class Solution {
public:
vector<int> asteroidCollision(vector<int>& asteroids) {
vector<int>res;
int n=asteroids.size();
for(int it:asteroids){//遍历数组
bool alive=true;//判断当前行星是否存活
while(alive && it<0 && !res.empty() && res.back()>0){
alive=res.back()<-it;//记录当前值大于栈顶值,当前值存活
if(res.back()<=-it) res.pop_back();//弹出较小的栈顶
}
if(alive) res.push_back(it);//当前行星存活,直接加入
}
return res;
}
};
394. Decodificação de strings
Idéia um:
- Considere usar par para combinar strings e tempos
- Gratificação atrasada :
- Cada combinação armazena : o caractere resultante da última travessia , o número de vezes do caractere atual
- Ao passar para um número : considerando que é maior que 9, você precisa realizar a operação *10 no último número armazenado
- Ao passar para o símbolo '[' : armazene o último caractere de resultado e o número atual de caracteres que acabou de ler na pilha, atribua num a 0 e deixe o caractere de resultado em branco (prepare-se para a próxima atribuição)
- Ao passar para o símbolo ']' : acumule o caractere atual (usando o número de caracteres no topo da pilha) e, em seguida , adicione-o ao caractere resultante no topo da pilha
- Ao passar para um caractere : adicione o caractere diretamente ao caractere de resultado ('[' é deixado em branco)
class Solution {
public:
string decodeString(string s) {
stack<pair<string,int>>st;
int num=0;
string res;
for(char it:s){
if(it>='0' && it<='9') num=num*10+(it-'0');//遍历到数字时
else if(it=='['){//遍历到左括号
st.push(make_pair(res,num));
res="";
num=0;
}
else if(it==']'){//遍历到右括号
string pre=st.top().first;//获取上次的结果字符
int n=st.top().second;//获取当前字符对应的数字
string cur;
for(int i=0;i<n;i++) cur+=res;
res=pre+cur;
st.pop();
}
else res+=it;//遍历到字母
cout<<num<<endl;
}
return res;
}
};