欢迎来到代码驿站!

C代码

当前位置:首页 > 软件编程 > C代码

C语言超详细讲解轮转数组

时间:2022-10-18 11:53:58|栏目:C代码|点击:

题目描述

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。OJ链接

实例

1.实例1

输入: nums = [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.实例2

输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释: 
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

解题思路

为了使算法空间复杂度为O(1),原地旋转,所以不能额外创建数组。

以实例1为例子。使用三次逆转法,让数组旋转k次

  • 先整体逆转 变为(7,6,5,4,3,2,1)
  • 逆转子数组[0, k - 1] 变为(5,6,7,4,3,2,1)
  • 逆转子数组[k, numsSize - 1] 变为(5,6,7,1,2,3,4)

1. 先整体逆转

设置两个指针变量分别指向头部和尾部。当 begin<end 时,交换两个位置上的值。绿色的数字为交换的位置。

在这里插入图片描述

2.逆转子数组[0, k - 1]

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.逆转子数组[k, numsSize - 1]

此处不赘述、同上面两个步骤的思路。这样就完成了对数组的轮转。

易错点

假如需要轮转的个数k大于数组numsSize的长度呢?

假如k为10,那么本题的结果是什么呢?

假如右旋10个数,那么先旋7个后将又回到了原来的样子。 然后再旋3个的话那么将和本题的旋3个一模一样。

  • 本题的精髓就是题目,叫做轮转数组。果然天道好轮回。轮转7次又回到了起点。轮转14次,21次…,只要七的倍数都回返回原地。
  • 所以在题目中要加入是否为k的倍数的判断代码
	if (k > numsSize)
	{
		k %= numsSize;
	}

代码

此代码带主函数。LeetCode题目中是接口类型的不带主函数。因为要轮转三次。所以把while循环写成一个函数,方便复用。

 LeetCode189. 轮转数组
#include<stdio.h>

void rotate1(int* begin, int* end)
{
	while (begin < end)
	{
		int t = 0;
		t = *begin;
		*begin = *end;
		*end = t;
		++begin;
		--end;
	}
}
void rotate(int* nums, int numsSize, int k) 
{
	//假如右旋10个数,先旋7个后又回到了原来的样子。然后再旋3次的话和本题再旋3次一模一样。
	if (k > numsSize)
	{
		k %= numsSize;
	}
	int* begin = nums;
	int* end = nums + numsSize - 1;
	rotate1(begin, end);
	rotate1(begin, begin+k-1);
	rotate1(begin + k, end);

}
int main()
{
	int nums[] = { 1,2,3,4,5,6,7 };
	int sz = sizeof(nums) / sizeof(nums[0]);
	rotate(nums, sz, 3);

	for (int i = 0; i < sz; i++)
	{
		printf("%d ", nums[i]);
	}
	return 0;
}

上一篇:C语言深入浅出讲解顺序表的实现

栏    目:C代码

下一篇:一起来了解一下C++的结构体 struct

本文标题:C语言超详细讲解轮转数组

本文地址:http://www.codeinn.net/misctech/216669.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有