Pilha LeetCode 75 parte 06

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;
    }
};

おすすめ

転載: blog.csdn.net/Ricardo_XIAOHAO/article/details/133363811
75