题目:左旋转字符串
描述
汇编语言中有一种移位指令叫做循环左移(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()库函数的具体使用方法,应该要充分理解后才能熟悉应用。

京公网安备 11010502036488号