前言:首先我们要明白什么旋转数组?它包括左旋和右旋;我们不妨拿一个例子来解释,更加的容易理解;假设有一组数据:1 2 3 4 5 6 7 8 9:

如果是左旋1次=====》2 3 4 5 6 7 8 9 1

如果是右旋1次=====》9 1 2 3 4 5 6 7 8

通过这个简单的小例子我们就可以理解旋转数组的意思;下面我们来具体分析一下方法吧!

目录

方法1:暴力求解法

1.1 解析:

1.2 具体代码:

左旋代码:

右旋代码:

1.3 代码解析:

方法2:三步翻转法

2.1 解析:

2.2 具体代码:

2.3 代码分析:


方法1:暴力求解法

1.1 解析:

这种方法很好想,也很好理解,但是效率不怎么高!!!

左旋:对于一组数据1 2 3 4 5 6 7 8 9;假设我们是左旋1次;结果是2 3 4 5 6 7 8 9 1;是怎么得到的呢?我们不难发现其实是先把第一个数据拿出来,然后把后面的n-1个数据依次往前移;最后在把首元素的数据放到最后面就行啦,这就需要写一个循环!!!这是左旋转1次的结果,那么如果要旋转k次了怎么办?再在外面写一层循环不就好啦!

右旋:对于一组数据1 2 3 4 5 6 7 8 9;假设我们是右旋1次;结果是9 1 2 3 4 5 6 7 8 ;同样的思路,我们需要把最后一个数据拿出来,然后把前面n-1个数据往后移;最后再把最后一个元素的数据放到最前面就行啦,同样也是两层循环!

所以这种方法很好想,也很容易理解,时间复杂度是O(n*k);空间复杂度为O(1)。

1.2 具体代码:

左旋代码:

右旋代码:

1.3 代码解析:

我们不难发现无论是左旋还是右旋最主要的就是移位部分要处理好:

对于左旋:我们把第一个元素取出来,用tmp存起来===》tmp=arr[0];然后在从前面第二个元素依次往前移,下标是依次-1的,所以是arr[j]=arr[j+1];最后令最后一个元素的位置arr[sz-1]=tmp即可;这里我们只强调两点:

1.只能从第二个元素依次往前移,而不能从最后一个元素往前移,因为这样会造成数据的覆盖!!!所以我们是从第二个元素开始把n-1个数据依次往前移的。

2.因为是n-1个元素,所以内层循环,我们的范围是[0,sz-1)===》也就是[0,sz-2];这样才是n-1个数据;如果这里我们取值范围写成[0,sz)===》也就是[0,sz-1];那么arr[j+1],也就是arr[sz]就会造成越界访问;毕竟下标是从0开始的,是[0,sz-1]取不到sz。

对于右旋:我们把第最后一个元素取出来,用tmp存起来===》tmp=arr[sz-1];然后在从后面倒数第二个元素依次往后移,下标是依次+1的,所以是arr[j+1]=arr[j];最后令第一个元素的位置arr[0]=tmp即可;这里我们也只强调两点:

1.只能从倒数第二个元素依次往后移,而不能从第一个元素往后移,因为这样同样会造成数据的覆盖!!!所以我们是从倒数第二个元素开始把n-1个数据依次往后移的。

2.同样我们内层循环的范围我们要把握好,我们是从倒数第二个元素开始的,它的下标是sz-2;所以范围应该是[sz-2,0];这里只要范围把握好,我相信就没什么问题了。

方法2:三步翻转法

2.1 解析:

所谓三步翻转,就是根据我们旋转(左旋或者右旋)的次数来作为分界面:

如果是左旋:从左边开始数,前面的[0,k-1]个元素翻转一次;后面的[k,sz-1]个元素翻转一次;最后整体的[0,sz-1]个元素在翻转一次;就能得到最终我们想要的结果;

如果是右旋:从右边开始数,前面的[0,sz-k-1]个元素翻转一次;后面的[sz-k,sz-1]个元素翻转一次;最后整体的[0,sz-1]个元素在翻转一次;就能得到最终我们想要的结果;

既然是三步翻转,每一次的步骤都是一样的,我们不妨封装一个函数,用的时候直接调用,避免写三次实现的代码,造成冗余。

时间复杂度为O(n),空间复杂度为O(1)。

2.2 具体代码:

2.3 代码分析:

无论是左旋还是右旋,实际上调用的函数是一样的,就是传参不一样,所以就把它们写在一块了,读者要是测试,请先注释掉一个旋转方式,在测试。

对于一组数据1 2 3 4 5 6 7 8 9;大小为sz;旋转次数为k:

左旋:就是从左边开始数;传数组arr,传左边元素的下标,传右边元素的下标,以旋转次数k为分界线:

第一次传下标为0开始,k-1结束;

第二次传下标为k开始,sz-1结束;

第一次传下标为0开始,sz-1结束;

右旋:就是从右边开始数;传数组arr,传左边元素的下标,传右边元素的下标,以旋转次数k为分界线:

第一次传下标为0开始,sz-k-1结束;

第二次传下标为sz-k开始,sz-1结束;

第一次传下标为0开始,sz-1结束;

注意:有没有注意我们在第二步还判断取余一下了,为什么呢?

因为如果旋转的次数大于数据的个数,即:k>sz,就会造成越界访问,比如:左旋传参[k,sz-1],就是前面大后面小;比如右旋传参[sz-k,sz-1],sz-k这里就是一个负数;所以我们需要判断一下k与sz的关系,如果k>sz,就k=k%sz;为什么这样就可以?因为这是一个循环的过程,假如有9个数据,我们旋转1次和旋转10次的结果其实是一样的,所以我们不妨直接取模,即避免造成越界访问,又能减少旋转次数!!!

求旋转数组(左旋和右旋)的常用两个方法(详解)相关推荐

  1. 二叉树的旋转,左旋和右旋

    在AVLTree中经常会有以某个节点为点对子树进行旋转的操作,今天就和大家分享一下什么是二叉树的旋转. 这是一棵二叉树,上图称为图一. 将图一中的树以1为旋转点进行左旋后得到图二: 将图一中的树以1为 ...

  2. 矩阵旋转(左旋,右旋)

    #include <iostream> using namespace std; const int M = 3; //行数 const int N = 5; //列数 int main( ...

  3. php 带建数组转字符串,php数组转换为字符串的两种方法详解【附视频】

    本篇文章主要给大家介绍PHP数组转换为字符串的两种方法.(文章末尾附有对应的视频教程) 第一种方法:使用PHP本身的函数implode来直接将数组转换为字符串. 第二种方法:使用循环遍历数组元素拼接成 ...

  4. 红黑树简介及左旋、右旋、变色

    红黑树简介及左旋.右旋.变色 红黑树(Red Black Tree)是一种自平衡二叉搜索树(二叉查找树),是一种特殊的二叉搜索树,在进行插入和删除时通过特定操作保持二叉树自身的平衡,从而获得较高的查找 ...

  5. 二叉树的左旋和右旋简单图示

    旋转是二叉树的基本操作,我们可以对任意一个存在父亲节点的子节点进行旋转,包括如下几种形式(设被旋转节点为x,其父亲节点为p): 1.左旋 旋转前,x是p的右儿子. x的左儿子(若存在)变为p的右儿子, ...

  6. matlab视频旋转振动,基于MATLAB的振动合成及左旋与右旋的动态模拟演示

    振动和波动是横跨物理学不同领域的一种非常普遍而重要的运动形式.振动的合成是研究实际问题常见的方法.其中同频率同方向简谐振动合成原理,是讨论光波.声波以及电磁辐射的干涉和衍射的理论基础;同方向,频率之和 ...

  7. Java 平衡二叉树之单旋(左旋,右旋)与双旋

    1.平衡二叉树 平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树, 可以保证查询效率较高. 具有以下特点:它是一 棵空树或它的左右两个 ...

  8. 实现字符串左旋和右旋的常见方法

    说起字符串的左旋和右旋问题,想必大家都不陌生,这是一个在初学C语言过程中经常遇到的一个问题,解题的思路可以说很多,每一个人的看待问题的角度都不同,所以就可以得到不同的解题思路.下面我就列举几种方法: ...

  9. HashMap-红黑树插入平衡、左旋、右旋源码解析

    目录 一.树的演变 二.红黑树 1.红黑树的特点 2.树左旋右旋的过程 3.红黑树插入节点情景分析: 三.HashMap插入平衡.左旋.右旋源码解析 1.添加值 2.插入平衡 3.左旋.右旋 一.树的 ...

最新文章

  1. 系统升级到10.13之后cocoapods安装失败问题解决办法
  2. 哔哩哔哩软测三面,面试题复盘
  3. 快速入门PyTorch(2)--如何构建一个神经网络
  4. 怎么安装python3.7 setuptools与pip_如何安装python到setuptools、pip工具安装
  5. 实战 | WebMagic 爬取某保险经纪人网站经纪人列表之网站列表爬取
  6. 检测php常量是否存在,php判断变量常量是否存在_PHP教程
  7. 约瑟夫环循环队列问题java_java 实现约瑟夫环
  8. javascript classList add报错
  9. php 面向对象编程(class)之从入门到崩溃 高级篇
  10. 单例模式中的线程安全问题
  11. 易语言单窗口单ip软件源码_想要挣钱创收 那就用脚本操作手机群控软件啊
  12. 考勤系统与服务器链接,考勤机怎么连接服务器
  13. 黑群晖文件服务器,折腾NAS,入手黑群晖
  14. 盲盒是怎么赚钱的(拆解盲盒App背后的盈利逻辑)
  15. N+1个数据恢复软件,全中文!全破解免费!(潘中医)_-Chaz-_新浪博客
  16. 大学物理实验电学基本参数的测量实验报告_大学物理电学基本实验实验报告
  17. 工商银行历年考试真题 银行校园招聘考试笔试资料
  18. php怎么分栏,wps怎么分栏排版
  19. python3代码换行与不换行问题
  20. linux 相关快捷键

热门文章

  1. 为什么用链路聚合_不宜使用链路聚合的场景
  2. outlook邮箱显示一直启动中_为何outlook客户端处理完服务器请求之后就一直显示正在关闭状态...
  3. 汉高任命蔡雪仙担任亚太区总裁,同时负责全球粘合剂技术移动和电子事业部...
  4. html单元格点击后填充颜色,如何实现WPS表格里点击某个单元格后该单元格变成制定颜色?...
  5. 小米8 线刷兼救砖_解账户锁_纯净刷机包_教程
  6. 最强赛亚人服务器维护,龙珠最强赛亚人手游正式版-龙珠最强赛亚人游戏最新特别版v2.0预约-日历表...
  7. Alexa排名是什么意思?对于网站Alexa排名的详细解说篇
  8. [Unity 3D] 重力感应与罗盘(一)
  9. 如何启用计算机双通道内存的方法,双通道内存 你会正确使用吗?
  10. malloc的使用方法