代码随想录算法训练营15期 Day 8 | 344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋

344.反转字符串

建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时候 不用库函数---库函数是解题的一部分的时候才可以用

题目链接:力扣

思路:本题用到了一个swap函数。

class Solution {
public:
    void reverseString(vector<char>& s) {
        for(int i=0,j=s.size()-1;i<s.size()/2;i++,j--)
        {
            swap(s[i],s[j]);
        }
      
    }
};

541. 反转字符串II

建议:本题又进阶了,自己先去独立做一做,然后在看题解,对代码技巧会有很深的体会。

题目链接:力扣

思路:每次处理是以2k处理,每次翻转k,如果不够2k,全部翻转。2k为循环进行遍历。这里使用的函数是reverse函数。注意reverse(i,i+k)函数进行翻转的时候,是左闭右开的情况。

下面的代码有一个地方是需要进行注意的,就是进行转换的过程之中,存在一个s.begin()+某一个数,我在编写代码的时候,忘记了s.begin()导致代码总是编译不过去。

class Solution {
public:
    string reverseStr(string s, int k) {

        //首先是以2k为循环,依次进行下去
       for(int i = 0;i<s.size();i+=(2*k))
       {
           if(i+k<=s.size())
           {
               reverse(s.begin()+i,s.begin()+i+k);
               continue;//跳出循环
           }
            //最后剩下的那一点
           reverse(s.begin()+i,s.begin()+s.size());
       }
       return s;


    }
};

剑指Offer 05.替换空格 

建议:对于线性数据结构,填充或者删除,后序处理会高效的多。好好体会一下。

题目链接:力扣

class Solution {
public:
    string replaceSpace(string s) {

        //首先记录空格的数量
        int count_space = 0;

        for(int i = 0;i < s.size();i++)
        {
            if(s[i]==' ')
            {
                count_space++;
            }
        }

        int oldsize  = s.size();

        s.resize(s.size()+count_space*2);

        int newsize = s.size();

        //开始从后往前进行遍历
        for(int i = newsize-1,j=oldsize-1;j<i;i--,j--)
        {
            if(s[j]!=' ')//注意这个条件
            {
                s[i]=s[j];
            }
            else{
            s[i] = '0';
            s[i-1] = '2';
            s[i-2] = '%';

            i-=2;
            }
           

        }
        return s;





    }
};

151.翻转字符串里的单词 

建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。 

思路:__wo_he__  ->  wo_he  ->  ow_eh  ->  wo_he.
不要使用erase,因为erase时间复杂度为O(n),时间复杂度上去了。比如说:if( ){erase一下}因此这里使用双指针方式解决。

扫描二维码关注公众号,回复: 15472111 查看本文章

定义一个快指针,定义一个慢指针。

class Solution {
public:

        void reverse(string &s,int begin,int end)
        {
            for(int i = begin,j = end;i<j;i++,j--)
            {
                swap(s[i],s[j]);
            }
        }

        //这道题比较难,看视频没有看明白,按照自己的思路来
        //首先是移除空格,所有的字母之间只是存在一个空格并且首尾字母之间不存在空格
        void removeBlank(string &s)
        {
            int slow = 0;//慢指针
            for(int i = 0;i<s.size();i++)
            {
                
                if(s[i]!=' ')//判断不为空的情况
                {
                if(slow!=0) s[slow++]=' ';//判断是否是第一个字母
                while(i<s.size()&&s[i]!=' ')
                {
                    s[slow++]=s[i++];
                }
                }   
            }
            //删除空格
            s.resize(slow);

        }

    string reverseWords(string s) {
        removeBlank(s);//去除空格

        reverse(s,0,s.size()-1);//翻转一下
        int start = 0;

        for(int i = 0;i<s.size();i++)
        {
            if((i != (s.size()-1)) && (s[i]==' '))//注意条件,到达尾端
            {
                reverse(s,start,i-1);
                start = i+1;//这句代码写错了,导致我浪费了很多时间
            }
            else if(i == (s.size()-1))
            {

                reverse(s,start,i);
            }
            
        }
        
        return s;
    }
};

剑指Offer58-II.左旋转字符串 

建议:题解中的解法如果没接触过的话,应该会想不到

题目链接:力扣

这道题的思路特别的简单,如下图所示:

首先是进行反转前n个字符串,然后再反转后n个字符串,之后再进行整体翻转。

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        reverse(s.begin(),s.begin()+n);
        reverse(s.begin()+n,s.end());
        reverse(s.begin(),s.end());
        return s;

    }
};

 




 

猜你喜欢

转载自blog.csdn.net/m0_47489229/article/details/130978601