k_eckelhttp://www.mscenter.edu.cn/blog/k_eckel & http://k-eckel.cnblogs.com

给定一个字符串,要求在给定位置进行左移。例如:给定”abcdefg”,给定i = 3进行左移,得到的结果应该为”defgabc”。这个问题很简单:1)可以将前3个字符保存,添加到字符串后面就可以;2)写一个循环左移,循环i次即可。上面两个解法很直观,但是1)中要使用3个额外空间,2)要多次循环,时间和空间都不是很合理。这里给出一种实现,使用的1个额外空间即可。

算法基于这样一种思想:将待移动的字符串从移动点分为ab两个子串,逆转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;

}

Posted on 2005-08-04 13:30  k_eckel's mindview  阅读(842)  评论(3)    收藏  举报