LeetCode笔试题 Rotate array

问题描述

给定一个数组,将数组中的元素向右移动 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;
}

猜你喜欢

转载自blog.csdn.net/zhangfei5354/article/details/89675480