数据结构-剑指offer-左旋转字符串

38 篇文章 0 订阅
38 篇文章 0 订阅

题目:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!

       思路:首先需要将位数n与字符串的长度进行比较,如果比字符串的长度大,就需要一个循环不断-len,直到n<len,但这也可以通过取余的方法来确定,n = n%len;接下来就是对字符串的处理了:①我的第一想法是可以新建一个字符串string result,将原字符串n~len-1位的字符依次存到新的字符串的0~len-n-1位,然后再将0~n-1位一次存到新的字符串的len-n~len-1位,但这样做的函数复杂度极高,时间复杂度大概是O(n^2),因为需要循环套循环。②原理:YX = (XTY T)T直通BAT视频中讲到过的方法),使用swap函数对需要操作的元素进行交换。以题目中的字符串S=”abcXYZdef”为例,当n=3时,可以把S分为:X={abc},Y={XYZdef},进行交换的时候,第一个swap实现对X的转置,第二个swap实现对Y的转置,第三个swap实现对(XTY T)的转置。

代码1:新建一个string result;执行出来的结果没有通过测试用例,不懂逻辑问题出在哪里,需要再排查

class Solution {
public:
    string LeftRotateString(string str, int n) {
        int len = str.size();
        if(len == 0) return str;
        string result;
        while(n > len)
            n = n-len;
        for(int i=n; i<len;i++){
            for(int j= 0;j<len-1-n;j++){
                result[j] = str[i];
            }
        }
        for(int i=0; i<n; i++){
            for(int j=len-n-1;j<len;j++){
                result[j] = str[i];
            }
        }
        return result;
    }
};

代码2:swap方法

class Solution {
public:
    string LeftRotateString(string str, int n) {
        int len = str.size();
        if(len == 0) return str;
        //while(n > len)
            //n = n-len;
        n = n%len;
        for(int i=0,j=n-1;i<j;i++,j--) swap(str[i],str[j]);
        for(int i=n,j=len-1; i<j; i++,j--) swap(str[i],str[j]);
        for(int i=0,j=len-1; i<j; i++,j--) swap(str[i],str[j]);
        return str;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值