自学内容网 自学内容网

leetcode 151反转字符串如何原地去除多余空格

题目:https://leetcode.cn/problems/reverse-words-in-a-string/description/
完整题解:https://leetcode.cn/problems/reverse-words-in-a-string/solutions/2611893/chu-li-kong-ge-ku-han-shu-reversefan-zhu-bioo
思路来自代码随想录,对其中的除去多余空格做详细解释
本题的输入数据会给很多多余空格,我们需要用双指针遍历只留下每个单词间的一个空格就可以了

        int slow=0;
        int fast=0;
        for(;fast<s.size();++fast)//动快指针
        {
            if(s[fast]!=' ')
            {
                if(slow!=0)
                {
                   s[slow++]=' ';
                }
                 while(fast<s.size()&&s[fast]!=' ')//!有字母了就在这里遍历,遍历出一个完成单词后退出,再下一个单词头进来了会直接在if(slow!=0)里在前一个补一个空格
                {
                    s[slow++]=s[fast++];
                }
            }
        }   
        s.resize(slow);//!!!把s的大小重新改变,去掉双指针后数组剩下的元素

** 重点在于理解if(slow!=0)什么时候生效**
当快指针遍历到非空字母的时候,要往slow的位置放

  1. 当刚刚开始遍历时,slow==0,遇到字母直接放入位置,不添加空格,消除字符串开头可能有的多余空格
  2. 用while遍历一整个单词,此时slow已经不等于0,而到了单词的下一个位置
  3. 此时快指针又遍历到字母(非空格)时,需要手动添加一个空格,if(slow!=0) { s[slow++]=' '; }此时就执行操作添加一个空格,slow又指向空格的下一个位置,方便后续操作

清楚多余空格后要resize s,不然后面的元素会影响结果


原文地址:https://blog.csdn.net/2301_81198610/article/details/135712192

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!