温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C语言轮转数组问题怎么解决

发布时间:2022-04-01 16:03:42 来源:亿速云 阅读:151 作者:iii 栏目:开发技术

今天小编给大家分享一下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 时,交换两个位置上的值。绿色的数字为交换的位置。

    C语言轮转数组问题怎么解决

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

    C语言轮转数组问题怎么解决

    C语言轮转数组问题怎么解决

    C语言轮转数组问题怎么解决

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

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

    易错点

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

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

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

    • 本题的精髓就是题目,叫做轮转数组。果然天道好轮回。轮转7次又回到了起点。轮转14次,21次&hellip;,只要七的倍数都回返回原地。

    • 所以在题目中要加入是否为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语言轮转数组问题怎么解决”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI