首页 > 代码库 > C++算法之 左旋转字符串中m个字符

C++算法之 左旋转字符串中m个字符

定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数

例子:

1:abcdefghi

m = 3;

就是移动abc   defghiabc

移动过程就是   abc def ghi -------> def abc ghi------> def ghi abc  ; 

 

2:abc def ghi jk

m = 3;

移动abc defghijkabc

移动过程就是 abc def ghi jk -------->def abc ghi jk--------> def ghi abc jk------>def ghi j abc k ------> def ghi jk abc; 

 

对于第一种情况是比较简单的,我们设立两个指针,让两个指针相差m

p1指向 a;p2指向d; 交换 a d; 然后 p1++; p2++;

此时p1指向b,p2指向e;交换 b e; 在 p1++;p2++;

一直循环; 直到 p2指向了末尾;

 

但是对于上面的第二种情况,因为p2移动到j的前面一个位置的时候; j 与 k 只有2,不够3个;

所以不能像上面那样循环,否则就是 def ghi jkc ab;

所以我们要把剩余的j与k 一步一步移动到abc 前面;

 

对于两种情况的不同就是 每次判断一下 p2+m-1的位置是否越界;

我们程序当中用的是 k = (n-m)- n%m;

//比如一个例子,abcdefghijk

// p1 p2

//当执行到这里时,defghi a b c j k

//p2+m出界 了,

//r=n-p2=2,所以以下过程,要执行循环俩次。

//第一次:j 步步前移,abcjk->abjck->ajbck->jabck

//然后,p1++,p2++,p1指a,p2指k。

// p1 p2

//第二次:defghi j a b c k

 //同理,此后,k步步前移,abck->abkc->akbc->kabc。

 

代码:

// RotateArray.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <string>using namespace std;void SWAP(char& a, char & b){	char  t =  a;	a = b;	b = t;}void RotateArray(string& str, int m)//m为移动字符串数{	if (str.length() == 0 || m <= 0)	{		return;	}	int n = str.length();	if (m%n <= 0)	{		return;	}	int p1 = 0, p2 = m;	//k为要移动的长度  例如abcdefghijk  m = 3,那么就是左旋转abc那么abc先移动到def再移动到ghi就是k = 6	//但是因为总长度为11,所以移动的k应该是 总长度n - 要移动的字符串数m再剪掉后面的 n%m;如果n%m == 0,那么	//表示总长度可以整除要移动的字符串数,这种情况后面不需要再有移动;	int k = (n-m) - n%m;	//交换p1p2指向的元素,然后移动p1,p2	while (k --)	{		SWAP(str[p1],str[p2]);		p1++;		p2++;	}	int r = n - p2;	while (r--)	{		int i = p2;		while (i>p1)		{			SWAP(str[i],str[i-1]);			i--;		}		p2++;		p1++;	}}int _tmain(int argc, _TCHAR* argv[]){	string ch= "abcdefghijk";       	RotateArray(ch,3);       	cout<<ch<<endl;       		getchar();	return 0;}


 

 

 

 

 

 

 

 

 

C++算法之 左旋转字符串中m个字符