深度解析利用队列的特性解决leetcode题目——反转

本文讨论了如何使用队列和双向队列的特性解决LeetCode中的字符串反转问题,避免了高时间复杂度的直接反转方法,通过控制元素的插入位置实现高效反转。
摘要由CSDN通过智能技术生成

    前置:对于队列而言,我们知道最基础的操作是,先进先出,后进后出。但是仅仅停留在这个认识是不够的,对于队列而言,其最有用的功能是可以帮助我们调整元素的顺序,以便于我们进行反转等操作,这里就反转进行深入探讨。

    正如leetcode新题:

    试想一下我们的第一思路可能是直接写一个反转的方法,在主函数中每次遇到'i'时,就调用一次,但是这样的时间复杂度很高,且对于边界值的控制需要一定技巧。那么我们再次审视这道题目,其实就是反转,如果借用双向队列的结构,自然的就为我们进行了反转,也就是我们可以通过让当前元素进入队列前面还是跟在前面元素的后面,形成反转操作。代码实现如下:

class Solution {
public:
    string finalString(string s) {
        deque<int>q;
        bool ishead=false;
        for(char ch:s)
        {
            if(ch!='i')
            {
                if(ishead)
                {
                    q.push_front(ch);
                }
                else{
                    q.push_back(ch);
                }
            }
            else{
                ishead=!ishead;
            }
        }
        string ans;
        ans=(ishead?string{q.rbegin(),q.rend()}:string{q.begin(),q.end()});
        return ans;
    }
};

    注记:当没有遇到字符‘i’时,说明不需要反转,我们直接push_front元素,将元素插入队列;当遇到字符‘i’时,说明要反转,反转的本质就是和之前的元素形成相反的顺序,那么我们pusu_back元素,将其插入到队列后面,最后维护一个ans数组,如果说,最终的ishead为真,说明在当前条件下,需要正向返回,那么由于一开始我们将元素push_front到队列,也就是相对标准是逆序的,所以返回{q.rbegin(),q.rend()},同理,如果为假,那么需要反向返回,即返回{q.begin(),q.end()};

其实还有类似的题目,如果合理使用队列或者栈这种数据结构,便会很容易调整顺序,达到效果。

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值