轮转数组详解

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/rotate-array/?envType=list&envId=QJxfEzqo

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

示例: 

void rotate(int* nums, int numsSize, int k) {}

 nums数组的地址,numsSize是数组的大小(方便起见,后面用n代指),k直的是向右轮转的次数。

 方法一:使用额外数组

思路:我们先创建一个新的数组,将原数组中的数根据k计算出在轮转之后的位置,然后放置在新数组中,遍历整个数组,直到完成所有元素的放置,最终将新数组的内容依次还给原数组。

假设这里有一个大小为5的数组,如果我们要轮转3次,那么第4个位置上的数就会到第二个位置上去。也就是第i个位置上的数会到第(i+k)%numsSize位置上去。直到了这个也就掌握了这个方法的关键所在。

然后我们知道轮转numsSize次,等于没有轮转,所以当k的值大于numsSize时,我们可以取余一次。

代码:

void rotate(int* nums, int numsSize, int k) {int newArr[numsSize];//创建一个同类型的数组//创建一个新的数组int k = k % numsSize;for (int i = 0; i < numsSize; i++) {newArr[(i + k) % numsSize] = nums[i];//根据k来得到旋转后的位置;}for (int j = 0; j < numsSize; j++) {nums[j] = newArr[j];//将新数组的数还给原数组。}
}

方法二:三次逆置法/翻转数组法

 假设这里有五个数,将其向右轮转2。

我们会发现第三次 就是我们所要的结果,那么是如何翻转的呢?

第一次是将后k个数逆置,第二次是将前n-k个数进行逆置,第三次是将整体进行逆置。这样就实现了k次轮转。

代码:

void reverse(int *a,int left,int right){while(left<right){int tmp = a[right];a[right] = a[left];a[left] = tmp;left++;right--;}
}
void rotate(int* nums, int numsSize, int k) {k %= numsSize;reverse(nums,numsSize - k,numsSize - 1);//逆置后面k个数reverse(nums,0,numsSize - k - 1);//逆置前面n-k个数reverse(nums,0,numsSize - 1);。。整体逆置}

这种方法第一次做难以想到,这与数学有关。

方法三:memcpy函数

 我们可以使用memcpy函数解决这道题。

我们首先分配一个临时内存,我们将原数组的后k个数,拷贝到这个临时空间中,再将前n-k数拷贝到tmp+k的地方,这样我们就实现了数组的轮转,只不过不是原数组,最后我们再将tmp拷贝到原数组中就完成了。

void rotate(int* nums, int numsSize, int k) {k = k % numsSize;int  *tmp = (int*)malloc(sizeof(int)*numsSize);memcpy(tmp+k,nums,sizeof(int)*(numsSize-k));memcpy(tmp,nums+numsSize-k,sizeof(int)*k);memcpy(nums,tmp,sizeof(int)*numsSize);free(tmp);tmp = NULL;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/493009.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows通过脚本打开自带的IE浏览器

1、桌面右键新建一个 txt 的文档 2、打开文档并且复制粘贴下面代码 CreateObject("InternetExplorer.Application").Visibletrue3、 保存并且关闭&#xff0c;修改文件后缀名为 vbs 4、双击打开即可。

【可申请试用】RT-Thread专业版全面支持瑞芯微RK3568系列平台并可实现混合部署...

RT-Thread 专业版是面向任务关键领域的高安全实时操作系统&#xff0c;已被广泛应用于航空航天&#xff0c;电力&#xff0c;轨交&#xff0c;车载&#xff0c;工业控制&#xff0c;新能源&#xff0c;医疗等国家重要领域&#xff0c;是各领域高可靠装备的基础核心软件。该版本…

Redis7

摘录 https://github.com/Romantic-Lei/Learning-in-practice/blob/master/Redis/ 官网地址: 英文&#xff1a;Redis 中文&#xff1a;CRUG网站 redis中文文档 安装包&#xff1a;https://redis.io/download/&#xff0c;选择redis7.0版本即可 Redis在线测试地址(不用下载也…

辉辉数码:目前电视盒子哪个最好?目前性能最好的电视盒子

大家好&#xff0c;我是辉辉&#xff0c;上期测评发布后我收到了很多粉丝的反馈希望我这期能分享电视盒子推荐&#xff0c;看看目前电视盒子哪个最好。我购入了市面上最热门的十几款电视盒子对比配置、系统后整理了五款目前性能最好的电视盒子推荐给大家。 品牌型号&#xff1…

C++ //练习 9.18 编写程序,从标准输入中读取string序列,存入一个deque中。编写一个循环,用迭代器打印deque中的元素。

C Primer&#xff08;第5版&#xff09; 练习 9.18 练习 9.18 编写程序&#xff0c;从标准输入中读取string序列&#xff0c;存入一个deque中。编写一个循环&#xff0c;用迭代器打印deque中的元素。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&am…

Python的字符串操作你用对了吗?

1.创建字符串 字符串指的是使用一对单引号或者一对双引号或者一对三个单引号或者一对三个双引号包裹的文本 # 创建字符串str1 hellostr2 "world"print(str1)print(str2) # 使文本原样输出str3 床上明月光&#xff0c;疑是地上霜。str4 """举头望…

算法训练 day36 | 435. 无重叠区间 763.划分字母区间 56. 合并区间

435. 无重叠区间 题目链接:无重叠区间 首先需要对区间排序&#xff0c;按照左边界或右边界排序都可以&#xff0c;本文用右边界排序。按照右边界排序后&#xff0c;从左向右记非交叉区域的个数。最后用区间总数减去非交叉区间的个数就是需要移除区间的个数。 记录非交叉区间的…

Vue + Echarts页面内存占用高问题解决

Vue Echarts页面内存占用高问题解决 1.问题描述 目前使用的是Vue2 Echarts4.x的组合&#xff0c;页面如下所示。 就是一个类似于神策的数据看板页面&#xff0c;左侧是一个导航栏&#xff0c;右侧看板页面中包含很多个报表图片&#xff0c;其中报表页面中对Echarts图表进…

如何实现固定公网地址远程访问内网Wagtail管理界面

文章目录 前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 前言 Wagtail是一个用Python编写的开源CMS&#xff0c;建立在Django Web框架上。Wagtail 是一个基于 Django 的开源内容管理系统&#xf…

docker build基本命令

背景 我们经常会构建属于我们应用自己的镜像&#xff0c;这种情况下编写dockerfile文件不可避免&#xff0c;本文就来看一下常用的dockerfile的指令 常用的dockerfile的指令 首先我们看一下docker build的执行过程 ENV指令&#xff1a; env指令用于设置shell的环境变量&am…

Kotlin:组合挂起函数

点击查看&#xff1a;组合挂起函数 中文官网 点击查看&#xff1a;组合挂起函数 英文文档 默认顺序调用 假设我们在不同的地方定义了两个进行某种调用远程服务或者进行计算的挂起函数。我们只假设它们都是有用的&#xff0c;但是实际上它们在这个示例中只是为了该目的而延迟了…

【C语言基础】:操作符详解(二)

文章目录 操作符详解一、上期扩展二、单目操作符三、逗号表达式四、下标访问[]、 函数调用()五、结构成员访问操作符六、操作符的属性&#xff1a;优先级、结合性1. 优先级2. 结合性 操作符详解 上期回顾&#xff1a;【C语言基础】&#xff1a;操作符详解(一) 一、上期扩展 …