問題描述
給定一個數組,將數組中的元素向右移動 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;
}