每日一题---OJ题: 旋转数组

片头

嗨! 小伙伴们,咱们又见面啦,今天我们一起来学习一道OJ题---旋转数组

emmm,看上去好像没有那么难,我们一起来分析分析 

比如: 数组里面有7个元素,分别为 1, 2, 3, 4, 5, 6, 7 , 现在我们将数组中的元素向右轮转3个位置

第一次轮转:将最后一个元素"7"放在第一个位置,后面的元素依次往后移动,变成  7, 1, 2, 3, 4, 5, 6

第二次轮转:将最后一个元素"6"放在第一个位置,后面的元素依次往后移动,变成  6, 7, 1, 2, 3, 4, 5

第三次轮转:将最后一个元素"5"放在第一个位置,后面的元素依次往后移动,变成  5, 6, 7, 1, 2, 3, 4

针对这道题,我们提供3种思路:

思路1: 右旋k次, 每次挪动旋转一位

定义一个变量temp,用来保存最后一个元素,将最后一个元素放到第一个位置,同时将后面的元素依次往右移动

代码如下:

void Reverse(int arr[], int time, int size) {time = time % size; //求具体的旋转次数for (int i = 0; i < time; i++) {//将最后一个元素保存在temp变量中int temp = arr[size - 1];for (int j = size-2; j >=0 ; j--) {//从下标为size-2的元素开始,一直到下标为0的元素,依次往后移动一位arr[j + 1] = arr[j];}//将最后一个元素放入第一个位置(还原)arr[0] = temp;}
}
int main() {int time = 3;int arr[] = { 1,2,3,4,5,6,7 };int sz = sizeof(arr) / sizeof(arr[0]);Reverse(arr, time,sz);for (int i = 0; i < sz; i++) {printf("%d ", arr[i]);}return 0;
}

运行结果为:

5  6  7  1  2  3  4 

But,当我们把代码放到leetcode上面显示不通过

哈哈哈哈,说明这道OJ题限制了时间复杂度,我们这种思路的时间复杂度为 O(n^2) ,题目不通过

那我们就换一种思路呗!

思路2: 我们把数组分成3个部分逆置,假设数组里面有7个元素,分别为 1, 2, 3, 4, 5, 6, 7 , 现在我们将数组中的元素向右轮转3个位置

第一个部分: 前n-k个逆置,这里的 n 为 7, k 为 3,也就是前4个逆置,变成 4, 3, 2, 1, 5, 6, 7
第二个部分: 后k个逆置, 这里的 k 为 3,也就是后3个逆置, 变成 4, 3, 2, 1, 7, 6, 5
第三个部分: 整体逆置,变成了 5, 6, 7, 1, 2, 3, 4

代码如下:

void Reverse1(int arr[], int start, int end) {int left = start;    //将start赋给left变量int right = end;     //将end赋给right变量while (left < right) {     //当left小于right的时候,进入循环//用临时变量temp实现逆置(左右元素交换)int temp = arr[left]; arr[left] = arr[right];arr[right] = temp;left++;   //每交换完一次,left向右移动right--;  //每交换完一次,right向左移动,直到两个变量相遇}    
}int main() {int time = 3;int arr[] = { 1,2,3,4,5,6,7 };int sz = sizeof(arr) / sizeof(arr[0]);Reverse1(arr, 0, sz - time - 1);     //前n-k个逆置Reverse1(arr, sz - time, sz - 1);    //后k个逆置Reverse1(arr, 0, sz - 1);            //整体逆置for (int i = 0; i < sz; i++) {printf("%d ", arr[i]);}return 0;
}

运行结果为:

5  6  7  1  2  3  4  

同时,我们将代码放到leetcode当中,显示通过

嗯,这种方法好是好,但是好像我如果第一次做这种题,肯定想不出来,那有木有第3种思路呢?

有的! 接下来我就来介绍第三种思路

思路3: 我们可以定义一个新的数组,用memcpy函数将原数组的内容拷贝到新数组中去,拷贝元素的同时,也就完成了逆置

代码如下:

void Reverse2(int arr[], int size, int time) {time = time % size;   //求出最终旋转次数int temp[20] = { 0 }; //定义一个临时数组temp,初始化数组为0//将原数组的后time个数拷贝到临时数组temp的前面位置中memcpy(temp, arr + size - time, sizeof(int) * time); //将原数组的前size-time个数拷贝到临时数组temp的后面位置中  memcpy(temp + time, arr, sizeof(int) * (size - time)); //将临时数组temp的所有元素拷贝回原数组memcpy(arr, temp, sizeof(int) * size);                  
}int main() {int nums[] = { 1,2,3,4,5,6,7 };int time = 3;int size = sizeof(nums) / sizeof(nums[0]);Reverse2(nums, size, time);for (int i = 0; i < size; i++) {printf("%d ", nums[i]);}return 0;
}

运行结果为:

 5  6  7  1  2  3  4 

我们把代码提交到leetcode上去,显示通过 

片尾 

今天我们学习了轮转数组这道OJ题,希望看完这篇文章能对友友们有所帮助 !    !    ! 

点赞收藏加关注 !   !   !

谢谢大家 !   !   !

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

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

相关文章

JavaScript教程(六)--- 数字和日期

数字和日期 本章节介绍了在 JavaScript 中使用数字和日期来处理和执行计算的概念&#xff0c;对象和函数。 数字 在 JavaScript 里面&#xff0c;数字均为双精度浮点类型&#xff08;double-precision 64-bit binary format IEEE 754&#xff09;&#xff0c;即一个介于 2^−…

LangChain调用tool集的原理剖析(包懂)

一、需求背景 在聊天场景中&#xff0c;针对用户的问题我们希望把问题逐一分解&#xff0c;每一步用一个工具得到分步答案&#xff0c;然后根据这个中间答案继续思考&#xff0c;再使用下一个工具得到另一个分步答案&#xff0c;直到最终得到想要的结果。 这个场景非常匹配la…

Centos7 k8s 集群 - Rook Ceph 安装

环境准备 基础环境 系统名称操作系统CPU内存硬盘Kubernete 版本Docker版本IPmasterCentos74c4gsdb 20G1.17.023.0.1192.168.1.128node01Centos74c4gsdb 20G1.17.023.0.1192.168.1.129node02Centos74c4gsdb 20G1.17.023.0.1192.168.1.130node03Centos74c4gsdb 20G1.17.023.0.1…

可变参模板

目录 概述 可变参函数模板 可变参类模板 概述 可变参模板是C11引入的一个功能强大的特性。英文名是Variadic Templates。其允许我们定义参数数量可变的模板函数和模板类&#xff0c;更加的提高了编写的灵活性和通用性。在可变参数模板中&#xff0c;参数的数量在编译时才会确…

ssm+vue的实验室课程管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的实验室课程管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

RabbitMQ消息模型之Simple消息模型

simple消息模型 生产者 package com.example.demo02.mq.simple;import com.example.demo02.mq.util.ConnectionUtils; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection;import java.io.IOException;/*** author Allen* 4/10/2024 8:07 PM* versi…

绝地求生:AUG爆裂弹球黑货箱:街机动漫风格大家会喜欢吗?

大好&#xff0c;我闲游盒&#xff01; 4.10更新后&#xff0c;AUG的新成长型也出来了&#xff0c;更新后我觉得AUG变好用了一点&#xff0c;不知道大家有没有感觉出来&#xff1f; 宝箱概率 本期主角 AUG-爆裂弹球&#xff08;紫色配粉红色&#xff09; 本次的AUG我才升到5级…

从 SQLite 3.4.2 迁移到 3.5.0(二十)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite---调试提示&#xff08;十九&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 ​ SQLite 版本 3.5.0 &#xff08;2007-09-04&#xff09; 引入了一个新的操作系统接口层&#xff0c; 与所有先前版本的 SQLi…

通过WebShell登录SQL Server主机并使用SSRS报表服务

背景信息 RDS SQL Server提供了WebShell功能&#xff0c;允许用户通过Web界面登录到RDS SQL Server实例的操作系统中&#xff0c;并在该操作系统中执行命令、上传下载文件等操作。WebShell功能方便用户对RDS SQL Server实例的管理和维护&#xff0c;特别是在无法使用SSH客户端的…

angular版本升级成16后css的踩坑

angualr版本升级16后&#xff0c;angualr项目打包后会把 left: 0; top: 0; right: 0; bottom: 0; 转换为inset&#xff1a;0&#xff0c; safir14.5以下的浏览器识别不了inset&#xff1a;0这个样式导致css样式失效。页面出现问题。 后面我特地学习了inset属性。 inset 是一…

社交网络的未来图景:探索Facebook的发展趋势

随着科技的不断进步和社会的快速变迁&#xff0c;社交网络作为连接人与人之间的重要纽带&#xff0c;扮演着日益重要的角色。而在众多社交网络中&#xff0c;Facebook作为老牌巨头&#xff0c;一直在探索着新的发展路径&#xff0c;引领着社交网络的未来图景。本文将深入探索Fa…

SQLite---调试提示(十九)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite Android 绑定&#xff08;十八&#xff09; 下一篇&#xff1a;从 SQLite 3.4.2 迁移到 3.5.0&#xff08;二十&#xff09; ​ 以下是 SQLite 开发人员跟踪、检查和了解 核心 SQLite 库。 这些技术旨在帮助理解 核…

open c UF_MODL_create_simple_hole 识别放置平面 UF_MODL_ask_face_data

在BLOCK上创建一个简单孔 UF_FEATURE_SIGN sign UF_NULLSIGN;double block_orig[3] { -25.0,-25.0,0.0 };char* block_len[3] { "50","50","30" };tag_t blk_obj;UF_MODL_create_block1(sign, block_orig, block_len, &blk_obj);tag_t bo…

ubuntu如何截图? ubuntu中截屏的三种方法

文章目录 1.ubuntu主要用途2.ubuntu如何截图&#xff1f;2.1 方法一&#xff1a;键盘按键快捷键截屏 2.2 方法二&#xff1a;系统自带软件2.3 方法三&#xff1a;第三方软件 Reference 1.ubuntu主要用途 1、桌面操作系统&#xff1a;Ubuntu可用作个人电脑或笔记本电脑的操作系…

certbot—30秒部署HTTPS,永久免费,自动续约;ssl证书

Certbot 是一个由 Let’s Encrypt 开发的免费开源工具&#xff0c;用于自动化部署和管理 SSL/TLS 证书。它具有以下几个显著的好处&#xff1a; 免费证书&#xff1a;Certbot 使用 Let’s Encrypt 作为其证书颁发机构&#xff0c;Let’s Encrypt 提供免费的 SSL/TLS 证书。这意…

Doris 内网安装部署,基于 CentOS 7

实测 CentOS 7.6 和 7.9都可用&#xff0c;CentOS安装包为&#xff1a;标准安装盘DVD版&#xff0c;如果系统安装的是精简版&#xff0c;需要挂载DVD版或者自行下载依赖。 参考文档 快速开始 - Apache Doris Doris 下载地址&#xff1a;2.1.1 ( Latest ) -> x64 ( avx2 )…

Axios与Fetch——请求相关知识回顾

一、Axios 1、常规使用 &#xff08;1&#xff09;.then 方式 axios.get("./js/covid-data.json ").then(res > {this.list res.dataconsole.log(this.list);}); &#xff08;2&#xff09;async 方式 async mounted() {await axios.get("./js/covid-d…

计算两个时间段的差值

计算两个时间段的差值 运行效果&#xff1a; 代码实现&#xff1a; #include<stdio.h>typedef struct {int h; // 时int m; // 分int s; // 秒 }Time;void fun(Time T[2], Time& diff) {int sum_s[2] { 0 }; for (int i 0; i < 1; i) { // 统一为秒数sum_s[…

上海计算机学会 2023年9月月赛 乙组T2 方格路径(二)(最短路)

第二题&#xff1a;T2方格路径&#xff08;二&#xff09; 标签&#xff1a;最短路题意&#xff1a;给定 n m n m nm的方格地图&#xff0c;每个点要么是空地 . . .&#xff0c;要么是障碍物 ∗ * ∗&#xff0c;求左上角到右下角&#xff0c;最少的移除障碍个数&#xff0c…

ZCC8703 60V升压型、降压型、升降压型LED恒流驱动器 替代SY8703

描述&#xff1a; ZCC8703是一种集成功率开关的多工作模式、宽输入/输出DC-DC LED驱动芯片&#xff0c;具有3V到60V的宽输入电压范围&#xff0c;集成了软启动&#xff0c;从而最大限度地减少对外部浪涌抑制组件的需求&#xff0c;使其成为宽输入电源范围LED驱动的理想选择。输…