C++算法(八)左旋转字符串

30 篇文章 2 订阅
15 篇文章 0 订阅


左旋转字符串

一、题目描述

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

示例 1:

输入: s = “abcdefg”, k = 2
输出: “cdefgab”

示例 2:

输入: s = “lrloseumgh”, k = 6
输出: “umghlrlose”

限制:

1 <= k < s.length <= 10000

作者:Krahets
链接:https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/589fz2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

二、解题思路及代码实现

1、解题思路

1、直接使用c++string 库函数substr进行拼接,两行代码搞定
2、把字符串当成一个首尾相接的环来处理,每次把第一个字符往字符串末尾移动,然后全部字符前移一步,循环操作,直到n个字符顺利移到字符串尾部。这种方式操作简单,别说左移,右移都可以实现,只是每个字符都需要频繁移动,效率低,优点是不消耗额外内存。“\0”被当成了临时内存,存放移动的一个元素,所以不需要额外内存。
3、把n个字符当成一个整体,递归和后面的字符交换,逐步挪到尾部。这样方式,比第二种方法效率要高,并不需要频繁移动每一个元素。以下是这种实现的源码。

2、C++代码实现

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        int length = s.length();
        if (length <= 1 || n >= length) return s;
        int right = length - n;
        int pos_left = 0;
        int pos_right = n-1;

        if (right >= n) {
            pos_left = 0;
            pos_right = n-1;

            while (pos_right + n < length) {
                for (int i = 0; i < n; i++) {
                    char tmp = s[pos_left+i];
                    s[pos_left+i] = s[pos_left+i+n];
                    s[pos_left+i+n] = tmp;
                }

                pos_left += n;
                pos_right += n;
            }
        }

        if (pos_right > length) {
            pos_left -= n;
            pos_right -= n;
        }

        if (pos_right < length) {
            int rest_count = length - pos_right - 1;
            //处理剩余数据,剩余数据小于n
            for (int i = 0; i < n; i++) {
                char tmp = s[pos_right - i];
                for (int j = 0; j < rest_count; j++) {
                    s[pos_right + j -i] = s[pos_right + 1 + j - i];
                }

                s[length - i - 1] = tmp;
            }
        }

        return s;
    }
};

三、提交结果

在这里插入图片描述


总结

从提交结果看,效率挺低的,但内存占用方面表现还不错。如果注重效率,内存占用可以松一点,直接使用拼接的方法执行效率更快。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值