/*
问题描述:数组 A={a,b,c,d,e}数组A从位置i旋转,例如i=3,旋转后的A为 A={d,e,a,b,c}
来源:网易算法课
日期:2017-10-12
说明:
提供了4个方法:
方法1、2是传统方法,通过对元素的逐次移位完成,时间复杂度较高
方法3、4时间复杂度都为O(n)
问题描述:数组 A={a,b,c,d,e}数组A从位置i旋转,例如i=3,旋转后的A为 A={d,e,a,b,c}
来源:网易算法课
日期:2017-10-12
说明:
提供了4个方法:
方法1、2是传统方法,通过对元素的逐次移位完成,时间复杂度较高
方法3、4时间复杂度都为O(n)
*/
#include <iostream>
#include <string>
using namespace std;
//方法1
void stringRotation1(string &str, int i)
{
char temp;
int j;
int rotationTimes = str.length() - 1 - i;
while (rotationTimes > 0)
{
temp = str[str.length() - 1];
j = str.length() - 1;
for (; j > 0; j--)
str[j] = str[j - 1];
str[0] = temp;
rotationTimes--;
}
}
//方法2:方法1是每一次把全部元素都移动,方法2每次只移动i元素前的元素
void stringRotation2(string &str, int i)
{
char temp;
int j, k = 0;
i++;
while (i < str.length())
{
temp = str[i];
for (j = i; j > k; j--)
str[j] = str[j - 1];
str[k] = temp;
i++;
k++;
}
}
//方法3,理论上可以推导,但代码暂时没有想法,后期补充
//方法4:先将整个数组倒转,分别对由i分割的两个字符串进行倒转,方法非常巧妙
void stringReverse(string &str, int begin, int end)
{
char temp;
while (end > begin)
{
temp = str[begin];
str[begin] = str[end];
str[end] = temp;
begin++;
end--;
}
}
void stringRotation4(string &str, int i)
{
stringReverse(str, 0, str.length() - 1); //将整个字符串翻转
stringReverse(str, 0, str.length() - i - 1);//将0-(i-1)翻转
stringReverse(str, str.length() - i, str.length() - 1); //将i-(length()-1)翻转
}
int main()
{
cout << 3 % 2 << endl;
string str = "abcdefghijklm";
int i = 11;
//stringRotation1(str, i);
//stringRotation2(str, i);
//stringRotation4(str, i);
cout << str << endl;
return 0;
}