左旋转字符串

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。

对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。

例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!

思路:

先将前三位旋转,再将后面的旋转,最后一块旋转

例子:

abcXYZdef    ==> XYZdefabc   n = 3

第一步:abc      ==>   cba

第二步:XYZdef     ==>  fedZYX

第三步:cbafedZYX    ==>   XYZdefabc

代码:

class Solution {
public:
    // 字符串反转函数, i指向开始位置,j指向结束位置
    void Reverse(string &str, int i, int j)
    {
        char temp;
        while(i < j)
        {
            temp = str[i];
            str[i] = str[j];
            str[j] = temp;
            ++i;
            --j;
        }
    }
    string LeftRotateString(string str, int n) {
        int len = str.size();
        if(len <= 0)
            return "";
        if (n <= len)
        {
            Reverse(str, 0, n-1);  // 第一步
            Reverse(str, n, len-1);
            Reverse(str, 0, len-1);
        }
        return str;
    }
};

思路二:利用库函数substr

substr 用方法: str2 = str1.substr(a,b);  将str2是str1的第a个后面的b个元素     (a,b]
// 思路:直接用string的库函数,str = str1.substr(a,b) str是str1的a之后的b个字符
class Solution {
public:
    string LeftRotateString(string str, int n) {
        int len = str.size();
        if(len <= 0)
            return "";
        string str2;
        str2 = str.substr(n,len-n);  //strsub是(n, ]
        str2 += str.substr(0,n);
        cout << str2;
        return str2;
    }
};
原文地址:https://www.cnblogs.com/xiaokang01/p/12463775.html