前置:对于队列而言,我们知道最基础的操作是,先进先出,后进后出。但是仅仅停留在这个认识是不够的,对于队列而言,其最有用的功能是可以帮助我们调整元素的顺序,以便于我们进行反转等操作,这里就反转进行深入探讨。
正如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()};
其实还有类似的题目,如果合理使用队列或者栈这种数据结构,便会很容易调整顺序,达到效果。