Bootstrap

【算法专题--栈】点击消除 -- 高频面试题(图文详解,小白一看就懂!!)

目录

一、前言

二、题目描述 

三、解题思路 

四、总结与提炼 

五、共勉    


一、前言

        点击消除 这道题,可以说是--栈专题--,最经典的一道题,也是在面试中频率最高的一道题目,通常在面试中,面试官可能会从多个方面考察这道题目,所以大家需要对这道题目非常熟悉哦!!
       本片博客就来详细的讲讲解一下 点击消除 的实现方法,让我们的面试变的更加顺利!!!

二、题目描述 

题目链接: 点击消除_牛客题霸_牛客网 (nowcoder.com)

三、解题思路 

如题目所述:

示例1:" abbc ",消除了相同且相邻的字母 b 后,剩下 " ac ", a 和 c 不是相邻的字母,最终结果为 " ac "

示例2:" abba ",消除了相同且相邻的字母 b 后,剩下 " aa ",消除 b 前不相邻的字母 a ,在消除后变相邻了,此时消除字母 a ,按照题目要求,最终输出结果为 0


 我们可以借助栈后进先出的原理来解决这个问题:

假设 s 是输入的字符串,s[ i ] 是当前我们访问的字母,我们用字符串 result 来模仿栈,

1、当 result 为空,先把字母添加到 result 中,如图,此时把 a 添加到 result 中

2、当 result 不为空时,判断 result 的最后一个字符(相当于栈顶元素) 和 s[ i ] 是否为相等的字母,

a. 如果不相等,把字母 s[ i ] 添加到 result 中(相当于进栈),如图,假设 result 的栈顶元素为 a,s[ i ] 为 b,它们不相等,所以 b 进栈

b. 如果相等,说明栈顶元素和 s[ i ] 是相邻且相等的字母,栈顶元素和 s[ i ] 是要消除的字母,此时删除栈顶元素,完成了一次消除。如图,假设 result 的栈顶元素为 b,s[ i ] 为 b,它们相等且相邻,所以删除栈顶元素 b ,此时的栈顶元素变为 a。


 根据上面的原理,再次来理解示例2:

i 从 0 开始:

s[ 0 ]:一开始栈为空,所以 a 进栈

s[ 1 ]:当访问字母 b 时,b 和栈顶元素 a 不相等,所以 b 进栈

s[ 2 ]:当访问字母 b 时,b 和栈顶元素 b 相等,所以 b 出栈

s[ 3 ]:当访问字母 a 时,a 和栈顶元素 a 相等,所以 a 出栈,此时 result 为空字符


代码1:用数组模拟栈 

#include <iostream>
using namespace std;
#include<string>
int main() {
   string enter;//接收输入的字符串
   cin>>enter;//输入
   string result;//最终结果的字符串,模拟栈
   for(int i=0;i<enter.size();i++)//遍历输入的字符串
   {
        //字符串不为空,且字符串的最后一个字符(即栈顶元素)和enter[i]字符相等
        if(result.size() && enter[i] == result.back())
        {
            result.pop_back();//消除字符串的最后一个字符,相当于出栈
        }
        else {
            //相当于进栈
            result+=enter[i];
        }
   }
   if(result.size())
   {
        cout<<result<<endl;//字符串不为空
   }
   else {
        cout<<0<<endl;//字符串为空
   }
   return 0;
}

代码2:直接用栈来解

#include <iostream>
#include <stack>
#include <string>
#include <algorithm>
using namespace std;

int main() 
{
    stack<char> st;
    string s;
    cin>>s;

    for(int i = 0;i<s.size();i++)
    {
        // 当栈为 空时 入栈
        if(st.empty())
        {
            st.push(s[i]);
        }
        else
        {
            // 栈顶 和 数组元素相等,出栈
            if(st.top()==s[i])
            {
                st.pop();
            }
            else
            {
                st.push(s[i]);
            }
        }
    }

    string res;

    if(st.empty())
    {
        cout<<0<<endl;
    }
     else
    {
        while(!st.empty())
        {
            res.push_back(st.top());
            st.pop();
        }
        reverse(res.begin(),res.end());

        cout<< res <<endl;
    }
    return 0;
}

四、总结与提炼 

     最后我们来总结一下本文所介绍的内容,本文讲解来一道力扣中有关 点击消除 的题目,这道题目是校招笔试面试中有关栈章节非常高频的一道题目,大家下去一定要自己再画画图,分析一下,把这段代码逻辑自己实现一遍,才能更好地掌握 !!  

五、共勉    

 以下就是我对 点击消除 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对 栈专题 的理解,请持续关注我哦!!!  

;