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