标签:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串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;
}
标签:
原文地址:http://blog.csdn.net/djb100316878/article/details/42142909