189. 轮转数组

目录

算法

分析


算法

给定一个整数数组 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]

提示:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

分析

此算法是要求数组原地进行轮转,经过分析,可以得出,每个元素在轮转之后的下标都为

复制代码
(当前下标+k)%数组长度

所以可以将数组遍历n(数组长度)次,每一次都将当前元素轮转后下标对应的元素先存起来,然后将对应的元素进行交换,循环n次即可。

代码如下:

java 复制代码
    public static void rotate(int[] nums, int k) {
        int num=nums[0],a=0;
        for(int i=0;i<nums.length;i++){
            int b=(a+k)%nums.length;
            int tmp=nums[b];
            nums[b]=num;
            num=tmp;
            a=b;
        }
    }

但是此代码放上去之后,又出现了一个问题:

也就是会出现轮转到已经轮转过的元素上去。

然后我看了一下官方的题解:

java 复制代码
class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        int[] newArr = new int[n];
        for (int i = 0; i < n; ++i) {
            newArr[(i + k) % n] = nums[i];
        }
        System.arraycopy(newArr, 0, nums, 0, n);
    }
}

官方的解决方法是new一个新的数组,并不是原数组进行轮转。

java 复制代码
System.arraycopy:

src:源数组

srcPos:源数组要复制的起始位置

dest:目标数组

destPos:目标数组放置的起始位置

length:复制的长度
相关推荐
2401_831920746 分钟前
C++代码国际化支持
开发语言·c++·算法
m0_6727033113 分钟前
上机练习第51天
数据结构·c++·算法
ArturiaZ21 分钟前
【day60】
算法·深度优先·图论
2401_8512729932 分钟前
自定义内存检测工具
开发语言·c++·算法
☆5661 小时前
C++中的命令模式
开发语言·c++·算法
仰泳的熊猫1 小时前
题目2577:蓝桥杯2020年第十一届省赛真题-走方格
数据结构·c++·算法·蓝桥杯
CoovallyAIHub1 小时前
Pipecat:构建实时语音 AI Agent 的开源编排框架,500ms 级端到端延迟
深度学习·算法·计算机视觉
灰色小旋风1 小时前
力扣13 罗马数字转整数
数据结构·c++·算法·leetcode
2301_810160952 小时前
C++与物联网开发
开发语言·c++·算法
cm6543202 小时前
基于C++的操作系统开发
开发语言·c++·算法