题目:左旋转字符串

描述

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


解题思路:如果学过汇编语言,那么这道题理解起来就相当容易了,对于给定的字符序列S,在循环左移K位后将该序列输出。例如字符序列S =“abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”,我们可以仔细观察后得出解题方法:

首先将要循环左移的前K位进行旋转,其次将除这K位的所有字符旋转,最后将整个字符旋转,最终的旋转结果为我们所需要的最终值。


通过以上例子我们进行详细分析:

a

b

c

X

Y

Z

d

e

f

因为题目要求需要左移三位,所以将前三位进行旋转

c

b

a

X

Y

Z

d

e

f

将除前三位的所有位进行旋转

c

b

a

f

e

d

Z

Y

X

将整***数全部翻转后得到的就是最终结果

X

Y

Z

d

e

f

a

b

c


通过上述例子的解读,我们可以很容易的解答成正确答案。

具体的C++代码如下所示:

class Solution {
public:
    void reverse(string &str,int i,int j){//该函数为交换函数,i指向起始位置,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;
    }
};

经过将上述表格与代码相结合,可以很快的解决问题,其中reverse函数为重点理解函数,在很多方面都有应用。


第二种解法:我们首先要明白一种库函数的使用方法,substr(参数)库函数。下面将主要介绍substr库函数的使用方法。

在库函数中:substr有两种格式,分别为:

格式1:substr(string string, int a, int b)

格式2:substr(string string, int a)

在第一种格式中,string表示需要截取的字符串,a表示截取字符串的开始位置。b表示要截取的字符串的长度。在第二种格式当中,string表示需要截取的字符串,a表示从第a个字符开始截取后面所有的字符串。
具体思路介绍:


a

b

c

X

Y

Z

d

e

f

首先将后续序列截取出来

X

Y

Z

d

e

f


其次将(a,b,c)添加到截取对象的后边,最终结果就显示出来了。

具体C++代码如下所示:

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);
        str2 += str.substr(0,n);
        return str2;
    }
};
这种方法,属于直接调用c++库函数的方法,不需要额外构造一个新的交换函数,但是substr()库函数的具体使用方法,应该要充分理解后才能熟悉应用。