剑指 Offer 58 - II. 左旋转字符串(3种方法)

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

题目:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。

请定义一个函数实现字符串左旋转操作的功能。

比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

示例 1:

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

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

限制:

1 <= k < s.length <= 10000

来源:力扣(LeetCode)

一:开辟新空间

class Solution {
public:
    string reverseLeftWords(string s, int n) {
   string ans = "";
        for(int i = n; i < s.size(); i++){
            ans += s[i];
        }
        for(int i = 0; i < n; i++){
            ans += s[i];
        }
        return ans;
    }
};
ans += s[i];

利用c++中字符串的特性
也就是说,先把后面的字符串输出,再输出前面的字符串也就是相当于左转了字符串
二:多次旋转(3次旋转法,原地修改)

class Solution {
public:
    //无论是左移还是右移都可以使用多次反转实现
    void reverseStr(string& s, int l, int r){
        while(l < r){
            char temp = s[r];
            s[r--] = s[l];
            s[l++] = temp;
        }
    }
    string reverseLeftWords(string s, int n) {
        //原地修改,空间复杂度O(1);
        reverseStr(s, 0, s.size() - 1);//先进行第一次(全体翻转)
      
        reverseStr(s, 0, s.size() - n - 1);//第二次 将第一个到倒数第n个反转
  
        reverseStr(s, s.size() - n, s.size() - 1); //第三次 将倒数第n个到最后一个反转
      
        return s;
    }
};

原地修改,不需要开辟额外的空间,其实也就是以时间换取空间

三:利用c++特性,原地修改

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        int len =s.size();

        s.resize(len+n);

        for(int i=0;i<n;i++){
            s[len++] =s[i];
        }

        s.erase(0,n);
        return s;
    }
};

利用了c++中string容器的resize函数,重新定义大小
利用for循环再新开辟出的位置进行赋值操作。
s.erase(0,n);再删除前n个位置。

目录
相关文章
|
数据采集 大数据 Python
FFmpeg 在爬虫中的应用案例:流数据解码详解
在大数据背景下,网络爬虫与FFmpeg结合,高效采集小红书短视频。需准备FFmpeg、Python及库如Requests和BeautifulSoup。通过设置User-Agent、Cookie及代理IP增强隐蔽性,解析HTML提取视频链接,利用FFmpeg下载并解码视频流。示例代码展示完整流程,强调代理IP对避免封禁的关键作用,助你掌握视频数据采集技巧。
301 7
FFmpeg 在爬虫中的应用案例:流数据解码详解
|
搜索推荐 算法 大数据
VR导航的实现原理、技术优势和应用场景
VR导航结合虚拟现实和室内定位,提供沉浸式精准导航服务,已在商场、机场、停车场、展馆和景区等领域应用,展现巨大潜力。通过模拟真实环境、精准定位和交互控制,提升用户体验。未来,VR导航将与AR、大数据融合,优化交互方式,并在更多场所普及。
473 1
VR导航的实现原理、技术优势和应用场景
|
安全 Linux 编译器
全面介绍eBPF-概念
全面介绍eBPF-概念
441 1
|
编译器 芯片
计算机中CPU 架构
【7月更文挑战第27天】
501 2
WK
|
机器学习/深度学习 算法
什么是Sigmoid函数
Sigmoid函数是在机器学习及统计学中广泛应用的一种数学模型,尤其适用于逻辑回归与神经网络中的激活场景。该函数能将任意实数映射至(0,1)区间,象征概率或事件发生可能性。其S型曲线特性使其在二分类问题中表现出色,同时具备连续平滑与中心对称的特点,利于采用如梯度下降等优化算法。然而,Sigmoid函数在极端输入值下会出现梯度消失的问题,影响模型训练效果。尽管有此局限性,它在特定应用场景中依然重要,例如需要输出概率值的情况。
WK
1027 0
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
248 2
|
缓存 算法 JavaScript
JIT引擎是如何实现即时编译的
【9月更文挑战第1天】JIT引擎是如何实现即时编译的
323 0
|
SQL 搜索推荐 Java
什么是笛卡尔积及其在SQL查询中的应用
什么是笛卡尔积及其在SQL查询中的应用
|
前端开发 测试技术 API
深入探究 Playwright:Frame 操作技巧
Playwright Python 框架提供API处理Web页面中的iframe。通过`frame()`方法进入iframe,如`page.frame(name=&#39;frame_name&#39;)`,并可使用CSS选择器选择。完成操作后,用`main_frame()`返回主文档。在iframe内,可执行点击、填充表单等操作,简化自动化测试和网页爬取任务。
深入探究 Playwright:Frame 操作技巧
|
存储 索引 Python
Python教程:深入了解 Python 中 Dict、List、Tuple、Set 的高级用法
Python 中的 Dict(字典)、List(列表)、Tuple(元组)和 Set(集合)是常用的数据结构,它们各自有着不同的特性和用途。在本文中,我们将深入了解这些数据结构的高级用法,并提供详细的说明和代码示例。
885 2