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;
    }
};

总结


加油!

相关文章
|
消息中间件 存储 大数据
快手基于Apache Hudi的实践
快手基于Apache Hudi的实践
196 0
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
本文是Java基础的进阶篇,对异常、集合、泛型、Java8新特性、I/O流等知识进行深入浅出的介绍,并附有对应的代码示例,重要的地方带有对性能、底层原理、源码的剖析。适合Java初学者。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
|
存储 Java 数据库连接
技术好文:quartz基本介绍和使用
技术好文:quartz基本介绍和使用
534 0
|
Web App开发 安全 前端开发
EDGE的使用心得和深度探索
EDGE的使用心得和深度探索
|
弹性计算 应用服务中间件 网络安全
ECS服务器使用:SSL证书安装、配置和问题定位指南
本文简要介绍了SSL证书的生成与部署方法,包括使用OpenSSL生成自签名证书和从CA获取证书的步骤,以及在Apache和Nginx服务器上的配置方法。此外,还提供了测试证书是否生效的方法和常见问题的解决策略,帮助确保证书正确安装并解决调试过程中可能遇到的问题。
1227 0
|
Python
Python量化炒股的数据信息获取—获取沪深股市每日成交概况信息
Python量化炒股的数据信息获取—获取沪深股市每日成交概况信息
326 5
|
Ubuntu 大数据 Linux
大数据入门系列 2:全网最全,VMware 虚拟机上安装 Ubuntu 完整步骤及需要注意的问题
大数据入门系列 2:全网最全,VMware 虚拟机上安装 Ubuntu 完整步骤及需要注意的问题
2183 1
大数据入门系列 2:全网最全,VMware 虚拟机上安装 Ubuntu 完整步骤及需要注意的问题
|
Web App开发 测试技术 Python
【如何学习python自动化测试】—— 浏览器驱动的安装 以及 如何更新driver
【如何学习python自动化测试】—— 浏览器驱动的安装 以及 如何更新driver
433 0
|
存储 网络协议 物联网
网络中的“客户端”和“服务器
【8月更文挑战第24天】
1615 0