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