当前位置: 首页 > news >正文

leetcode_189. 轮转数组

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 --;}}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LLMs之RAG:GraphRAG(本质是名词Knowledge Graph/Microsoft微软发布)的简介、安装和使用方法、案例应用之详细攻略
  • PAT甲级真题1020树的遍历
  • Spring Boot中@Async注解的使用及原理 + 常见问题及解决方案
  • MFC CRectTracker 类用法详解
  • Linux环境下安装Nodejs
  • Flutter热更新技术探索
  • 【ffmpeg命令入门】重新编码媒体流、设置码率、设置帧速率
  • 昇思25天学习打卡营第21天|DCGAN生成漫画头像
  • 算法学习笔记:贪心算法
  • Java集合框架的内部揭秘:List、Set与Map的深潜之旅
  • PHP MySQL 创建数据库
  • 数仓工具—Hive语法之宏(Macro)
  • 数据采集监控平台:挖掘数据价值 高效高速生产!
  • 单例模式 单例模式在多线程中是否线程安全, 如何保证线程安全。
  • react中状态管理useState
  • canvas 五子棋游戏
  • Facebook AccountKit 接入的坑点
  • Golang-长连接-状态推送
  • learning koa2.x
  • REST架构的思考
  • spark本地环境的搭建到运行第一个spark程序
  • Spring Cloud中负载均衡器概览
  • 阿里云购买磁盘后挂载
  • 搭建gitbook 和 访问权限认证
  • 大快搜索数据爬虫技术实例安装教学篇
  • 关于for循环的简单归纳
  • 规范化安全开发 KOA 手脚架
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 强力优化Rancher k8s中国区的使用体验
  • 智能合约Solidity教程-事件和日志(一)
  • nb
  • C# - 为值类型重定义相等性
  • ​ArcGIS Pro 如何批量删除字段
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (0)Nginx 功能特性
  • (13):Silverlight 2 数据与通信之WebRequest
  • (30)数组元素和与数字和的绝对差
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (笔试题)合法字符串
  • (补充)IDEA项目结构
  • (二十三)Flask之高频面试点
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (三)c52学习之旅-点亮LED灯
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (算法)硬币问题
  • (五)网络优化与超参数选择--九五小庞
  • (一)UDP基本编程步骤
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)jdk与jre的区别