首页 > 其他分享 >leetcode_189. 轮转数组

leetcode_189. 轮转数组

时间:2024-07-17 21:54:38浏览次数:17  
标签:轮转 reverse nums int length 数组 189 leetcode

leetcode_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

题解–反转数组

如果把这道题当成简单的模拟器, 那情况就会变得比较复杂, 除非使用额外的空间, 将原数组复制一份, 然后循环执行nums[(i + k) %length], 这也不是不行, 只是稍显笨拙.

其实我们可以换个思路, 将原来的数组轮转其实可以用反转数组来实现

  1. 将数组整体反转
  2. 将数组0~k-1反转
  3. 将数组k~length-1反转

我们来证明一下, 假如我们要将下面这个数组轮转3个位置,

在这里插入图片描述

我们先将整个数组整体反转

在这里插入图片描述

紧接着反转前3个元素

在这里插入图片描述

在然后, 反转剩下的元素

在这里插入图片描述

看, 是不是很神奇, 我们就真的通过这种方式实现了数组轮转.

原理是什么呢

数组轮转本来就可以看作是直接把数组右边的k个元素直接截下来, 然后插到开头的位置, 但是由与我们这是数组, 不是链表, 不能只移动右边的k个而不动其他的,

这时如果我们让整个数组整体反转, 然后再分别反转前k个, 和后面length - k个, 就等效于直接把后面k个元素拆下来, 插到了开头.

Java

class Solution {
    public void rotate(int[] nums, int k) {
        int length = nums.length;
        k = k % length;
        reverse(nums, 0, length -1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, length -1);

    }
    public void reverse(int nums[], int l, int r) {
        while (l < r) {
            nums[l] = nums[l] ^ nums[r] ^ (nums[r] = nums[l]);
            l ++;
            r --;
        }
    }
}

c++

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int length = nums.size();
        k = k % length;
        reverse(nums, 0, length - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, length -1);
    }
    void reverse(vector<int>& nums, int l, int r) {
        while ( l < r) {
            //nums[l] = nums[l] ^ nums[r] ^ (nums[r] = nums[l]);
            swap(nums[l], nums[r]);
            l ++;
            r --;
        }
    }
};

标签:轮转,reverse,nums,int,length,数组,189,leetcode
From: https://blog.csdn.net/qq_42742845/article/details/140505919

相关文章

  • LeetCode-环形链表、环形链表 II
    一、环形链表.-力扣(LeetCode)判断是否有环,使用快慢指针,开始时都指向头节点,快指针每次走两部,慢指针每次走一步,如果在走的过程中,慢指针和快指针相同(也就是快指针和慢指针指向的节点的同)那么就说明这个链表是带环链表;原理: 若是这个链表代换,那么快慢指针一定不会走向NULL;只......
  • LeetCode - #97 交错字符串
    文章目录前言1.描述2.示例3.答案关于我们前言本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。我们社区陆续会将顾毅(Netflix增长黑客,《iOS面试之道》作者,ACE职业健身教练。)的Swift算法题题解整理为文字版以方便大家学习与阅读。......
  • LeetCode-计数质数
    计数质数给定整数n,返回所有小于非负整数n的质数的数量。示例1:输入:n=10输出:4解释:小于10的质数一共有4个,它们是2,3,5,7。示例2:输入:n=0输出:0示例3:输入:n=1输出:0......
  • leetcode145. 二叉树的后序遍历,递归法+迭代法,全过程图解+步步解析,一点点教会你迭代法
    leetcode145.二叉树的后序遍历,递归法+迭代法给你一棵二叉树的根节点root,返回其节点值的后序遍历。示例1:输入:root=[1,null,2,3]输出:[3,2,1]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]递归法还是一如既往的简单。postorder函数是递归函数,用......
  • CANXL协议解读系列 | (2)一文读懂ISO 11898-2:2024 CANXL物理层
        2024年3月22日,ISO推出11898-2:2024版本,标志着CAN总线收发器的最高速率由CANFD行业认可的8Mbit/s提速到最高20Mbit/s(2024年5月24日ISO11898-12024已发表)。20Mbit/s的传输带宽不仅填补了CAN与Ethernet之间速率差距,2048Byte的payload和实时性的保留也给CAN网络本身带来......
  • LeetCode第257题:二叉树的所有路径的Java实现
    摘要LeetCode第257题要求生成二叉树的所有从根节点到叶子节点的路径。本文将介绍两种Java解决方案:迭代法和递归法。1.问题描述给定一个二叉树的根节点,按照从根到叶的顺序遍历所有路径,并将它们作为列表的列表返回。2.示例分析输入:[1,2,3,null,null,4]'输出:[[1,2],[1,......
  • CF1898D Absolute Beauty 题解
    思路容易发现,如果\(a_i>b_i\)则将\(a_i\)和\(b_i\)交换。在数轴上标出要交换的四个数的位置若线段\(a_ib_i\)和线段\(a_jb_j\)互不相交,此时交换比两条线段处于其他位置时更优。具体证明这里就不再赘述,其他题解讲的已经很清楚了。所以只需交换最大的\(a_i\)和最小......
  • 0189-输出 PPM 图片
    环境Time2022-11-14WSL-Ubuntu22.04Rust1.65.0前言说明参考:https://raytracing.github.io/books/RayTracingInOneWeekend.html目标编写一个简单的程序,输出一张.ppm格式的图片并查看。ppm格式ppm是一种用ascii字符来表示图片的方式。具体内容参考:https://zh.......
  • LeetCode 2263. Make Array Non-decreasing or Non-increasing
    原题链接在这里:https://leetcode.com/problems/make-array-non-decreasing-or-non-increasing/description/题目:Youaregivena 0-indexed integerarray nums.Inoneoperation,youcan:Chooseanindex i intherange 0<=i<nums.lengthSet nums[i] to num......
  • LeetCode算法笔记5
    题目描述给你一个字符串 s,找到 s 中最长的 回文子串示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。示例2:输入:s="cbbd"输出:"bb"提示:1<=s.length<=1000s 仅由数字和英文字母组成解法:classSolution:deflongestPalindrome(sel......