其实编程之美也有类似的题,这道题是编程珠玑第二章的题目。
题目描述:给定一个字符串,将字符串循环移位K次。
最简答的方法就是,通过O(n)的辅助空间,将数组循环移位,时间复杂度就是O(n)
但是如果要求空间复杂度为O(1)呢?
观察规律可知,对前K位反转以及后面的反转,最后对整个字符串反转就能达到O(1)的空间复杂度。
PS:注意处理k>字符串的长度的情况
1 #include2 #include 3 4 using namespace std; 5 6 void reverseStr(string &s,int i,int j) 7 { 8 while(i < j) 9 {10 char tmp = s[i];11 s[i] = s[j];12 s[j] = tmp;13 ++i;14 --j;15 }16 }17 18 void leftRotate(string &s,int k)19 {20 int len = s.length();21 k = k%len;22 reverseStr(s,0,k-1);23 reverseStr(s,k,len-1);24 reverseStr(s,0,len-1);25 }26 27 int main()28 {29 string s("abcdefgh");30 leftRotate(s,3);31 cout< <