码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-12-25 11:22:04      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:

定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串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个字符

标签:

原文地址:http://blog.csdn.net/djb100316878/article/details/42142909

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!