翻转问题--旋转数组

Posted 水澹澹兮生烟.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了翻转问题--旋转数组相关的知识,希望对你有一定的参考价值。

问题一:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
1.借助辅助空间
在直接进行遍历的过程中,我们要将数组移动k个位置,则说明我们需要将数组的所有元素整体移动K次,在每次移动时
我们先分析这个问题,设原数组下标位index;在这里我们画图分析:
在这里插入图片描述
从图中,我们可以知道当他要将数组移动k个位置时,每一个其中数组中的每一个元素都要移动到[(index+k)%numsize]的下标下。因此,在这里,我们需要借助辅助空间。

int* reverse_num(int* num, int numsize, int k){//借助辅助空间
	//移动到[(index+k)%numsize]的下标下
	assert(num != NULL);
	int ret = 0;
	int* re_num = (int *)malloc(sizeof(int)*numsize);
	for (int i = 0; i < numsize; i++){
		re_num[(i + k) % numsize] =num[i] ;
	}
	for (int i = 0; i < numsize; i++){
		num[i] = re_num[i];
	}
	free(re_num);
	return num;
}

在这里要注意的是,在动态申请空间后,一定要注意使用完后将他释放,否则有可能会造成内存泄漏。
2.直接进行遍历
我们分析,画图所示:
在这里插入图片描述
在图中,我们知道了依次遍历的过程和结果,而我们可以通过遍历整个数组达到循环一次,而要移动k个则要循环k次。

int* reverse_num(int* num, int numsize, int k){//遍历法
	int ret = 0;
	for (int i = 0; i < k; i++){//控制循环k次
		int temp = num[numsize - 1];
		for (int j = 0; j < numsize; j++){//因为要进行数组的旋转
			//这里借助数组最后一个元素,在交换的过程中,将整个元素向后移动一位
			ret = num[j];
			num[j] = temp;
			temp = ret;
		}
	}
	return num;
}

3.翻转法
在c语言中没有reverse()函数,因此在这里我们自己写了这个函数。
逆置函数:

int* reverse(int* num, int size){
	int ret = 0;
	for (int i = 0; i < size / 2; i++){
		ret = num[i];
		num[i] = num[size - i - 1];
		num[size - i - 1] = ret;
	}
	return num;
}

旋转数组函数:

int* reverse_num(int* num, int numsize, int k){//翻转法
	assert(num != NULL);
	int kx = k%numsize;
	reverse(num, numsize-kx);
	reverse(num + numsize - kx, kx);
	reverse(num, numsize);
	return num;
}

最后三种方法的运行代码:
在这里插入图片描述
在这里,如果给出字符串翻转,那没就和上面的一样,只需要改变它的数据类型就行了。
**
在这里傻作者总共总结了三种方法,如果有什么错误,欢迎在评论区指正嗷。

以上是关于翻转问题--旋转数组的主要内容,如果未能解决你的问题,请参考以下文章

翻转数组

二维数组6:数组的水平翻转

垂直于屏幕时,视图在 Y 轴上的旋转动画上剪辑

leetcode 每日一题 48. 旋转图像

leetcode 每日一题 48. 旋转图像

代码创建 WPF 旋转翻转动画(汇总)