k_eckel:http://www.mscenter.edu.cn/blog/k_eckel & http://k-eckel.cnblogs.com
给定一个字符串,要求在给定位置进行左移。例如:给定”abcdefg”,给定i = 3进行左移,得到的结果应该为”defgabc”。这个问题很简单:1)可以将前3个字符保存,添加到字符串后面就可以;2)写一个循环左移,循环i次即可。上面两个解法很直观,但是1)中要使用3个额外空间,2)要多次循环,时间和空间都不是很合理。这里给出一种实现,使用的1个额外空间即可。
算法基于这样一种思想:将待移动的字符串从移动点分为a、b两个子串,逆转a,再逆转b,再逆转得到的整个字符串。即:(a’b’)’ = ba。
|
//main.cpp #include <iostream> using namespace std; void Reverse(char* src,int l,int r) { int tmp = 0; while (l < r) { tmp = *(src + l); *(src + l) = *(src + r); *(src + r) = tmp; l++; r--; } } void ReverseString(char* src,int len,int idx) { Reverse(src,0,idx - 1); Reverse(src,idx,len - 1); Reverse(src,0,len - 1); } int main(int argc,char* argv[]) { char str[] = "abcdefghi"; cout<<str<<endl; ReverseString(str,9,3); cout<<str<<endl; return 0; } |
浙公网安备 33010602011771号