1.
暴力旋转
while(循环次数--)
{
-
void move_left(char arr[], int count)
-
{
-
int i = 0;
-
int len = strlen(arr);
-
for (i = 0; i < count; i++)
-
{
-
char tmp = arr[0];
-
int j = 0;
-
for (j = 0; j < len-1; j++)
-
{
-
arr[j] = arr[j + 1];
-
}
-
arr[len - 1] = tmp;
-
}
-
}
}
这种方法太麻烦,每次移动一个字符就得把其他的全部移动。时间复杂度O(N^2)
2.
m 位m位的翻转,再把最后面剩下的不足m位的一个一个移到那m个前面,时间复杂度近似O(n)
-
#include <iostream>
-
using namespace std;
-
#include <string>
-
-
void Rotate(string &s,int m)
-
{
-
if(s.size() == 0 || m <= 0)
-
{
-
return;
-
}
-
int first = 0,second = m;
-
int n = s.size();
-
int r = (n - m) - n%m;
-
while(r--)
-
{
-
swap(s[first++],s[second++]);
-
}
-
int Count = n - second;
-
while(Count--)
-
{
-
int i = second;
-
while(i > first)
-
{
-
swap(s[i],s[i - 1]);
-
i--;
-
}
-
first++;
-
second++;
-
}
-
cout << s;
-
}
-
int main()
-
{
-
string s("abcdefghij");
-
Rotate(s,3);
-
return 0;
-
}
优化:
(1)还是像2中m位m位翻转,不过移到最后,就不再是一位一位把剩下的
移到那m个前面,而是把剩下的看成一个子串,用递归的方法来继续翻转,直到递归到我们想要的样子。
(2)前面也不变,到最后用第一种暴力旋转暴力解决。
4.三步旋转法
首先对前m位逆序,再对后面剩下的逆序,再对整个序列全部逆序。
-
void reverse(char *str, int left, int right)
-
{
-
while (left < right)
-
{
-
swap(str + left, str + right);
-
left++;
-
right--;
-
}
-
}
-
void move_left(char arr[], int count)
-
{
-
int len = strlen(arr);
-
reverse(arr, 0, count - 1);
-
reverse(arr, count, len - 1);
-
reverse(arr, 0, len - 1);
-
}
阅读(1452) | 评论(0) | 转发(0) |