左旋转字符串
汇编语言中有一种移位指令叫做循环左移(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; } };