题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串"abcdef"左旋转2位得到字符串"cdefab"
//1. 暴力移位法
//左移1位函数
void leftshiftone(char *s, int n)
{
char t = s[0];
for(int i = 1; i < n; ++i)
{
s[i-1] = s[i];
}
s[n-1] = t;
}
// 调用leftshiftont函数,左移m位
void leftshift(char *s, int n, int m)
{
while(m--)
{
leftshiftone(s, n);
}
}
//2. 三步翻转法
//实现给定长度字符串翻转
char *invert(char *start, char *end)
{
char tmp, *ptmp = start;
while(start != NULL && end != NULL && start < end)
{
tmp = *start;
*start = *end;
*end = tmp;
start++;
end++;
}
return ptmp;
}
//pos为要旋转的字符个数或长度
char *left(char *s, int pos)
{
int len = strlen(s);
invert(s, s + (pos - 1));
invert(s + pos, s + (len - 1));
invert(s, s+(len -1));
return s;
}
//3. 指针翻转法
#include <iostream>
#include <string>
using namespace std;
void rotate(string &str, int m)
{
if(str.length() == 0 || m <=0)
return;
int n =str.length();
if(m % n <= 0)
return;
int p1 = 0, p2 = m;
int k = (n - m) - n % m;
//交换p1/p2指向元素,并移动p1/p2
while(k--)
{
swap(str[p1], str[p2]);
p1++;
p2++;
}
//重点,处理尾部行,例如“abcdefghij"
int r = n - p2;
while(r--)
{
int i = p2;
while(i > p1)
{
swap(str[i], str[i-1]);
i--;
}
p1++;
p2++;
}
}
int main()
{
string ch = "abcdefghijk";
rotate(ch, 3);
cout << ch << endl;
return 0;
}
参考:http://blog.csdn.net/v_JULY_v/article/details/6322882