问题描述
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
示例 2:
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
基本算法:
根据给定的k 将数组分为两部分,两部分都进行数组逆置,然后在整体逆置。
代码 :
void reserve(int start, int end, int *arr)
{
int tmp;
while (start <= end)
{
tmp = arr[start];
arr[start++] = arr[end];
arr[end--] = tmp;
}
}
void Rotate(int *arr,int len, int num)
{
//断言
assert(arr != NULL);
//判断条件 当num是负数或者大于arr数组长度时直接返回
if (num < 0 || num >= len)
{
return;
}
reserve(0, num, arr);//将数组前一部分逆置
reserve(num + 1, len - 1, arr);//将数组后一部分逆置
reserve(0, len - 1, arr);//将数组整体逆置
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7 };
int len = sizeof(arr) / sizeof(arr[0]);
Rotate(arr, len, 3);
for each (int i in arr)
{
cout << i;
}
cout << endl;
getchar();
return 0;
}