Day8——反转字符串、反转字符串||、替换空格、反转字符串里的单词、左旋字符串

简介: Day8——反转字符串、反转字符串||、替换空格、反转字符串里的单词、左旋字符串

前言


今日文案:

如果说艰难险阻是人生的黑夜,那么自信就是照亮黑夜的火把。自信的目光是自豪的,自信的微笑是成熟的,自信的力量是巨大的,自信的神态是从容的。

一、反转字符串


题目描述:

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

题目来源:

力扣

解题思路:


就是一个简单双指针,很反转数组一样。

class Solution {
public:
    void reverseString(vector<char>& s) {
        int n=s.size();
    int left=0,right=n-1;
    while(left<right)
    {int temp=s[left];
      s[left]=s[right];
      s[right]=temp;
        right--;
        left++;
    }
    }
};

二、反转字符串||


题目描述:


给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。

如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

题目来源:

力扣

解题思路:


关键是判断字符串剩余的长度,还有指针所指的位置。

class Solution {
public:
    string reverseStr(string s, int k) {
    int n=s.size();
        int left,right;
        for(int i=0;i<n;i+=(k*2))        //每次i自增2k
      {    
            if(i+k<n)                    //也就是right还在字符串范围内
            {
        left=i;                  //left,每次加2k
                right=i+k-1;                //right与left的距离其实是固定的,可以用笔算
            }
            else
            {
                left=i;                //如果right已经超了,那就直接指向末端
                right=n-1;
            }
            while(left<right)            //交换
            {
                int temp=s[left];
                s[left]=s[right];
                s[right]=temp;
                right--;
                left++;
            }
        }
        return s;
    }
};

三、替换空格


题目描述:

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1:

输入:s = "We are happy."

输出:"We%20are%20happy."

题目来源:

力扣

解题思路:


我一开始最早想到的是遍历到空格就直接插入%20,不是简简单单?但是,%20是三个字符,但空格却只是一个,这就不够空间了,所有扩大空间是必要的,那么一个变三个,我们就是扩大空间就行。

那我们要怎么做,重新申请一个大数组,再遍历输入???可以,但没必要,我们看一下这种双指针解法。

class Solution {
public:
    string replaceSpace(string s) {
        int n1=s.size(),count=0;
        for(int i=0;i<n1;i++)        //遍历
        {
            if(s[i]==32)            //要是是空格就记录
            {
                count++;
            }
        }
        s.resize(n1+count*2);        //加大空间
        int n2=s.size();
        for(int i=n1-1,j=n2-1;i<j;i--,j--)          //从后开始遍历
        {
            if(s[i]!=32)                            //前面没有遇到空格之前,就搬运
            {
                s[j]=s[i];
            }
            else                        //遇到空格了,后面先存放%20然后后面继续遍历
            {
                s[j]='0';
                s[j-1]='2';
                s[j-2]='%';
                j=j-2;
            }
        }
        return s;
    }
};

四、反转字符串中的单词


题目来源:

力扣

解题思路:


这道题,我一开始看真的懵了,写不出来要怎么反转字符串里的单词,我只会整个反转,直接看代码吧。

class Solution {
public:
    void Delet(string &s,int start,int end)
    {
        int slow=0,j=0;
        for(int i=start;i<=end;i++){
            if(s[i]!=' ')                    //等于字母的时候开始操作了
            {
                if(slow!=0)       //如果slow不在开头了,可以直接手动加一个空格,作为单词间隔
                {
                    s[slow]=' ';    
                    slow++;
                }
                while(i<s.size()&&s[i]!=' ')    //搬运
                {
                    s[slow]=s[i];
                    slow++;
                    i++;
                }
            }
        }
        s.resize(slow);
    }
    void myswap(string &s,int left,int right)
    {
        while(left<right)            //交换字符
        {
            int temp=s[left];
            s[left]=s[right];
            s[right]=temp;
            left++;
            right--;
        }
    }
    string reverseWords(string s) {
        int start=0,end=s.size()-1,i=0,j=0,count=0;
        Delet(s,start,end);
        myswap(s,start,s.size()-1);
        while(i<=s.size())            //注意判断好i,和j的值
        {
            if(s[i]==' ')
            {
                myswap(s,j,i-1);
                j=i+1;
            }
            i++;
        }
        myswap(s,j,s.size()-1);        //后面要多做一组,因为最后一组已经退出了
    return s;
    }
};

五、左旋转字符串


题目来源:

力扣

解题思路:


三步走,左部分反转,右部分反转,全部反转。

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

总结


加油!

相关文章
|
7月前
代码随想录 Day7 字符串1 LeetCode T344反转字符串 T541 反转字符串II 151翻转字符串的单词
代码随想录 Day7 字符串1 LeetCode T344反转字符串 T541 反转字符串II 151翻转字符串的单词
29 0
|
2月前
反转字符串
反转字符串
20 1
|
4月前
|
C++ Python
leetcode-557:反转字符串中的单词 III
leetcode-557:反转字符串中的单词 III
35 0
|
5月前
|
C++
(C++)反转字符串中的单词
(C++)反转字符串中的单词
24 0
|
7月前
|
Shell
【Leetcode -342. 4的幂 -344.反转字符串 -345.反转字符串中的元音字母】
【Leetcode -342. 4的幂 -344.反转字符串 -345.反转字符串中的元音字母】
26 0
|
9月前
|
Java
反转字符串中的单词
反转字符串中的单词
34 0
leetcode151反转字符串中的单词
leetcode151反转字符串中的单词
43 0
leetcode151反转字符串中的单词
|
算法 Java C++
反转字符串中的单词 (LeetCode 151)
反转字符串中的单词 (LeetCode 151)
284 0
LeetCode 557. 反转字符串中的单词 III
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
43 0
|
机器学习/深度学习 NoSQL Shell
344. 反转字符串
344. 反转字符串
66 0