首页 > 其他分享 >剑指 Offer 58 - II. 左旋转字符串

剑指 Offer 58 - II. 左旋转字符串

时间:2023-05-22 10:04:44浏览次数:44  
标签:58 Offer int 反转 元素 II 字符串 string size

剑指 Offer 58 - II. 左旋转字符串

</br></br>

题目:

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"

示例1:

输入: s = "abcdefg", k = 2
输出: "cdefgab"

示例2:

输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"

限制:

1 <= k < s.length <= 10000

</br></br>

思路一:

可以实例化一个新的string类的字符串,先将原字符串中下标为k的元素开始将其赋值到新的字符串中,再将原子符串中从0开始到k-1的元素赋值到新字符串中,因为只是将字符调换顺序,所以新字符串的大小和原子符串大小相同。如示例1中abcdefg字符串k = 2,那么就从下标为2的元素开始赋值给新的字符串,将k ~ s.size()-1的元素遍历赋值完之后,此时新字符串为cdefg;再从原子符串的头部开始遍历到k-1,再依次赋值给新字符串,此时新字符串就是cdefgab

注意:当k > s.size()时,通过k = n % s.size()找到有意义旋转次数,避免无意义旋转,减少时间成本。

代码如下:

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        int k = n % s.size(); //找到有意义旋转次数,避免无意义旋转。
        string s1; //新定义字符串
        int size = s.size(); //字符串大小
        s1.resize(size);//开空间
        int i = k;
        int j = 0;
        //将k~size-1的元素赋值给新字符串
        while(i < size ) 
        {
            s1[j++] = s[i++];
        }
        //将0~k-1的元素赋值给新字符串
        i = 0;
        while(j < size)
        {
            s1[j++] = s[i++];
        }
        return s1;
    }
};

时间复杂度:O(N)

空间复杂度:O(N)

</br></br>

思路二:

通过反转函数实现旋转。

1.先将k ~ size - 1的元素反转,如示例1中abcdefg字符串将 k ~ size - 1反转后为abgfedc

2.再将0 ~ k - 1的元素反转,示例1中经过第一次反转之后再经过本次反转就变成bagfedc

3.最后将整体反转,即0 ~ size - 1反转,经过本次反转就变成cdefgab

代码如下:

代码1:自定义一个反转函数

class Solution {
public:
    //反转函数
    void Reverse(string& s, int left, int right)
    {
        while(left < right)
        {
            swap(s[left++],s[right--]);//使用swap函数实现交换
        }
    }
    string reverseLeftWords(string s, int n) {
        int size = s.size();
        int k = n % size;
        Reverse(s,k,size - 1); //将k ~ size - 1的元素反转
        Reverse(s,0,k - 1); //将0 ~ k - 1的元素反转
        Reverse(s,0, size - 1);//最后将整体反转
        return s;
    }
};

代码2:使用库中的反转函数

class Solution {
public:
    //反转函数
    string reverseLeftWords(string s, int n) {
        int size = s.size();
        int k = n % size;
        reverse(s.begin()+k,s.end()); //将k ~ size - 1的元素反转
        reverse(s.begin(),s.begin()+k); //将0 ~ k - 1的元素反转
        reverse(s.begin(),s.end());//最后将整体反转
        return s;
    }
};

时间复杂度:O(N)

空间复杂度:O(1)

</br></br>

思路三:

通过使用string类中的erase函数和push_back函数完成。如示例1中abcdefg字符串,k = 2,先将字符a保存起来,然后使用erase函数删除字符a,再将其尾插,形成字符串bcdefga;再将字符b保存起来,再删除尾插,形成字符串cdefgab

此法仅供参考,并不推荐。

代码如下:

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        int k = n % s.size();
        while(k--)
        {
            char ch = s[0];
            s.erase(0,1);
            s.push_back(ch);
        }
        return s;
    }
};

时间复杂度:O(N)

空间复杂度:O(1)

标签:58,Offer,int,反转,元素,II,字符串,string,size
From: https://blog.51cto.com/u_15562309/6320950

相关文章

  • WinServer2008下IIS8如何给网站配置域名/IP来访问
    Windows2008下IIS7主机头如何配置,IIS7主机头编辑绑定设置Windows2008r2搭建网站服务器,对于IIS6如何添加主机头,小编之前介绍了方法。下面本经验演示一下IIS7怎么添加主机头,如何配置网站添加主机头设置1.主机头查看,在“开始---运行”中输入inetmgr命令之后,点击“确定”按钮即......
  • hdu 4758 Walk Through Squares(AC自动机+DP,4级)
    WalkThroughSquaresTimeLimit:4000/2000MS(Java/Others)    MemoryLimit:65535/65535K(Java/Others)TotalSubmission(s):234    AcceptedSubmission(s):58ProblemDescription  Onthebeamingdayof60thanniversaryofNJUST,asamilitary......
  • 剑指 Offer 05. 替换空格
    剑指Offer05.替换空格</br></br>题目:请实现一个函数,把字符串s中的每个空格替换成"%20"。示例:输入:s="Wearehappy."输出:"We%20are%20happy."限制:0<=s的长度<=10000</br></br>思路1:可以通过实例化出一个新的string对象,通过对原来字符串进行遍历,将原字符......
  • Nas Docker 安装个人记账web项目:firefly_iii &beancount-gs
    NasDocker安装个人记账web项目:firefly_iii&beancount-gs1.经过搜索以及GPT的询问,通过预览界面感觉firefly_iii官方示例demo:https://demo.firefly-iii.org/官方安装文档:https://docs.firefly-iii.org/firefly-iii/installation/docker/本人采用的是群晖Nasdocker安装:这个......
  • :ArmSoM研发团队联合Banana pi开源社区基于Rockchip RK3588 soc发布了ArmSoM W3 单板计
    ArmSoM推出的W3rk3588单板计算机采用核心板+底板设计方式,核心板采用LGA封装方式,核心板尺寸仅45mm50mm4.1mm,且RK3588SOC所有Pin脚对外引出。ArmSoMW3单板计算机接口示意图如下:[email protected][email protected],8nmGPUA......
  • RK3588安装ROS 解决Rviz以及Gazebo报错问题
    RK3588安装ROS解决Rviz以及Gazebo报错问题InfoOperatingSystem&VersionUbuntu20.04KernelVersion(LinuxOnly)5.10.110PlatformROC-RK3588S-PC一、前言记录一下在RK3588上安装ubuntu20.04和ROS的过程,很早之前配置过,最近又重新配置了一遍,特此记录一......
  • LeetCode 113. 路径总和 II
    题目链接:LeetCode113.路径总和II题意:给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。解题思路:与LeetCode112.路径总和相似,在遍历过程中,记录遍历过的每一个点即可。递归法递归代码:varres[][]intva......
  • 记一次将 .netcore 项目用 IIS 进程调试
    环境:win10,VisualStudio2022 在.netframework年代,我们都习惯用iis进程调试代码。因为用F5调试代码效率太低下。现在.netcore时代,这种好习惯可不能丢。简单记录一下,我的操作过程。 1.首先用IIS挂载网站,看能不能把发布的好的网站跑起来2.其次用IIS增加网站,......
  • 剑指 Offer 44. 数字序列中某一位的数字
    题目描述:数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。 限制:0<=n< 2^31    结论: 所求数位①在某个 digit 位数中;②为从数字 ......
  • gpt2有307200个神经元,那依次推测gpt3有3584万神经元?GPT4有1.024亿个神经元?
    gpt2有307200个神经元15亿参数据此推测,gpt3有1750亿参数难道有3584万神经元?这么多神经元就这么厉害了,怪不得那些蜜蜂、鸟类这么聪明,几亿神经元够够了。像OthersideAI的CEOMattShumer,就试用了一下网页端的Claude-100k总结技术报告的效果。他先测了波Claude-9k的效果,发现它面......