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:复制的长度
相关推荐
SoftLipaRZC35 分钟前
单链表的应用:经典OJ题与通讯录项目实战
数据结构
SoftLipaRZC39 分钟前
单链表专题:从概念到实现
数据结构
折哥的程序人生 · 物流技术专研7 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
想吃火锅10058 小时前
【leetcode】14.最长公共前缀js
算法·leetcode·职场和发展
云絮.9 小时前
数据库操作
数据库·mysql·算法·oracle
小林ixn9 小时前
LeetCode 206. 反转链表(迭代 + 递归详解)
算法·leetcode·链表
凡人叶枫10 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
菜鸟‍11 小时前
LeetCode 1 27 和 704 || 两数之和 移除元素 二分查找
算法·leetcode·职场和发展
退休倒计时12 小时前
【每日一题】LeetCode 142. 环形链表 II TypeScript
算法·leetcode·链表·typescript
popcorn_min13 小时前
Digits 手写数字识别:随机森林多分类 + 像素级特征热力图
算法·随机森林·分类