#include <iostream>
using namespace std;
/*
问题描述:将一个具有n个元素的数组向左循环移动i个位置。
*/
/*将数据反转的实现*/
void reverses(char *arr, int start, int over)
{
for(; start < over; start++, over--)
{
char temp = arr[start];
arr[start] = arr[over];
arr[over] = temp;
}
}
/*将数据反转*/
void converse(char *arr, int n, int i)
{
// 先反转前i个元素
reverses(arr, 0, i - 1);
// 再反转剩下的n-i个元素
reverses(arr, i, n - 1);
// 最后将整个数组反转
reverses(arr, 0, n - 1);
for(int j = 0; j < n; j++)
{
cout << arr[j] << ' ';
}
}
int main()
{
// 定义一个字符数组
char arr[10] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
converse(arr, 10, 5);
return 0;
}
说明:
以上数组arr,我们可以看成是数组ab转换为数组ba(a代表数组前i个元素,b代表数组余下的n-i个元素),先将a逆置得到a’b,再将b逆置得到a’b’,最后将整个a’b’逆置得到(a’b’)’ = ba。
例如:
对于abcdefghij,将其分成两部分,abcde 和 fghij,
1.先将abcde逆置得到edcba
2.再将fghij逆置得到jihgf
两次逆置之后得到:edcbajihgf
3.将edcbajihgf逆置得到:fghijabcde
算法分析:
该算法不需要额外开辟空间,空间复杂度为O(1),时间复杂度为O(n)