C语言轮转数组问题怎么解决
今天小编给大家分享一下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 此处不赘述、同上面两个步骤的思路。这样就完成了对数组的轮转。 假如需要轮转的个数k大于数组numsSize的长度呢? 假如k为10,那么本题的结果是什么呢? 假如右旋10个数,那么先旋7个后将又回到了原来的样子。 然后再旋3个的话那么将和本题的旋3个一模一样。 本题的精髓就是题目,叫做轮转数组。果然天道好轮回。轮转7次又回到了起点。轮转14次,21次…,只要七的倍数都回返回原地。 所以在题目中要加入是否为k的倍数的判断代码 此代码带主函数。LeetCode题目中是接口类型的不带主函数。因为要轮转三次。所以把while循环写成一个函数,方便复用。 以上就是"C语言轮转数组问题怎么解决"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。2.逆转子数组[0, k - 1]
3.逆转子数组[k, numsSize - 1]
易错点
if (k > numsSize) { k %= numsSize; }
代码
LeetCode189. 轮转数组#include