练习题——【学习补档】轮转数组

问题描述

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 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:

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

问题分析

//分析:这是一个差异化输入输出问题,输入数组A,输出数组B。

解决方案

//解决方案:建立方法进行数组A的到数组B的变化
//逻辑上:我们可以看到,轮转的本质就是数组的倒序排列,倒叙排列包含了“左右互换”和“序号颠倒”两个变化
//“左右互换”和“序号颠倒”存在重复抵消的情况,整体倒叙排列可以抵消局部倒叙中的序号颠倒变化,而保留左右互换的变化,

(保留的原因是两种变化的作用对象不一样,数组整体的倒序排列的“左右互换”生效对象宏观来看为两个数组,“序号颠倒”生效对象为数组整体; 我们要实现轮转数组需要左右互换这个变化,因此我们可以通过局部的倒叙排列,然后整体的倒叙颠倒,序号颠倒抵消。
在这里插入图片描述

//问题1:怎么实现轮转,
//答; 以k为准,把原数组分割为两个数组,输入数组分为左数组和右数组,左数组转置,右数组转置,最后左右数组整体转置
//问题2:如果原数组只有一个数字怎么办
//加一个判断,只有一个元素不做处理
//问题3:如果向右轮转的位置大于数组长度怎么办
//用轮转数模去数组长度

代码

//分析:这是一个差异化输入输出问题,输入数组A,输出数组B。
//解决方案:建立方法进行数组A的到数组B的变化
//问题1:怎么实现轮转,
//逻辑上:我们可以看到,轮转的本质就是数组的倒序排列,倒叙排列包含了“左右互换”和“序号颠倒”两个变化
//“左右互换”和“序号颠倒”存在重复抵消的情况,整体倒叙排列可以抵消局部倒叙中的序号颠倒变化,而保留左右互换的变化,
//(保留的原因是两种变化的作用对象不一样,数组整体的倒序排列的“左右互换”生效对象宏观来看为两个数组,“序号颠倒”生效对象为数组整体) 
//我们要实现轮转数组需要左右互换这个变化,
//因此我们可以通过局部的倒叙排列,然后整体的倒叙颠倒,序号颠倒抵消。

//答; 以k为准,把原数组分割为两个数组,输入数组分为左数组和右数组,左数组转置,右数组转置,最后左右数组整体转置
//问题2:如果原数组只有一个数字怎么办
//加一个判断,只有一个元素不做处理
//问题3:如果向右轮转的位置大于数组长度怎么办
//用轮转数模去数组长度

void swap(int* star,int* end)
{
    int tmp =*star;
    *star=*end;
    *end=tmp;
}
void reverse(int *nums,int star,int end)
{
    while(star<end)
    {
        swap(&nums[star],&nums[end]);
        star++;
        end--;
    }
}
void rotate(int* nums, int numsSize, int k)
{
    k%=numsSize;
    //注意我们的转置是转置数组后面的数字,要以数组后面的序号为准
    reverse(nums,0,numsSize-k-1);   
    reverse(nums,numsSize-k,numsSize-1);
    reverse(nums,0,numsSize-1);
    //如果我们上来就把整个数组转置了,那么转置对象就换到前面去了,序号就以前面的序号为准
    // reverse(nums, 0, nums.length - 1);  
    // reverse(nums, 0, k - 1);
    // reverse(nums, k, nums.length - 1);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值