Leetcode-轮转数字

news2025/1/13 19:41:03

189. 轮转数组 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/rotate-array/

目录

189. 轮转数组 - 力扣(LeetCode)https://leetcode.cn/problems/rotate-array/

题目

解题

第一种方法

第二种方法


题目

给定一个整数数组 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

解题

第一种方法

// 定义一个辅助函数 Reverse,用于将数组 nums 中指定范围 [left, right] 内的元素逆序
void Reverse(int* nums, int left, int right) {
    // 使用双指针 left 和 right 分别指向待逆序区间的首尾元素
    while (left < right) { // 当 left 未超过 right 时,继续交换元素
        // 临时保存 left 指向的元素值
        int tmp = nums[left];
        // 将 right 指向的元素值赋给 left,完成一次交换
        nums[left] = nums[right];
        // 将临时保存的值赋给 right,完成另一次交换
        nums[right] = tmp;
        // 左指针向右移动一位,右指针向左移动一位,准备下一轮交换
        left++;
        right--;
    }
}

// 主要函数 rotate,用于将数组 nums 顺时针旋转 k 步
void rotate(int* nums, int numsSize, int k) {
    // 对旋转步数 k 取模 numsSize,确保 k 有效(0 <= k < numsSize),避免重复旋转
    k %= numsSize;

    // 采用“三段逆置”策略:
    // (1)逆置前半部分(左段):从第一个元素到倒数第 k + 1 个元素(不含)
    Reverse(nums, 0, numsSize - k - 1);

    // (2)逆置后半部分(右段):从第 k + 1 个元素到最后一个元素
    Reverse(nums, numsSize - k, numsSize - 1);

    // (3)整体逆置整个数组,由于前两步已经分别逆置了左右两段,此时逆置整个数组相当于将左右两段正确拼接
    Reverse(nums, 0, numsSize - 1);
}

第二种方法

// 定义一个名为fun的函数,接收以下参数:
// 1. int* nums:一个整型指针,指向待旋转数组的起始位置
// 2. int numsSize:整型变量,表示数组的元素数量
// 3. int k:整型变量,表示需要向右旋转的位数
// 4. int* arr1:一个整型指针,用于存储旋转过程中的临时结果

void fun(int* nums, int numsSize, int k, int* arr1) {
    // 对k取模以确保有效旋转次数(避免多次循环)
    k %= numsSize;

    // 使用memcpy函数将原数组中最后k个元素复制到arr1的前k个位置
    memcpy(arr1, nums + numsSize - k, k * sizeof(int));

    // 使用memcpy函数将原数组中剩余的元素(即前numsSize - k个元素)复制到arr1的k个位置之后
    memcpy(arr1 + k, nums, (numsSize - k) * sizeof(int)); // 总个数减去上一步的数就是剩下没拷贝的

    // 最后,使用memcpy函数将已逆序排列的arr1复制回原数组nums
    memcpy(nums, arr1, numsSize * sizeof(int)); // 再将我们逆置后的数拷贝到原来的数组
}

// 定义一个名为rotate的函数,对外提供接口,接收以下参数:
// 1. int* nums:一个整型指针,指向待旋转数组的起始位置
// 2. int numsSize:整型变量,表示数组的元素数量
// 3. int k:整型变量,表示需要向右旋转的位数

void rotate(int* nums, int numsSize, int k) {
    // 动态分配内存,为临时数组arr1分配与原数组相同大小的空间
    int* arr1 = (int*)malloc(numsSize * sizeof(int));

    // 检查内存分配是否成功,若失败则返回
    if (arr1 == NULL) {
        return;
    }

    // 调用fun函数进行实际的数组旋转操作
    fun(nums, numsSize, k, arr1);

    // 释放临时数组arr1所占用的内存,避免内存泄漏
    free(arr1);
}

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

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

相关文章

如何把为知笔记导入到Notion笔记里面

&#x1f4a1; 大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 为知笔记并不开放&#xff0c;笔记文件只能以pdf或者图片的方向导出来&#xff0c;无法与其他笔记文件相互导入导出&#xff0c;然而&#xff0c;稍…

如何测试响应式网站

我们每天通过多种设备访问互联网。移动电话&#xff0c;台式机/笔记本电脑&#xff0c;平板电脑&#xff0c;平板电脑…我们所掌握的设备数量已经增长为天文数字。作为消费者&#xff0c;体验很棒。我们可以随时随地在任何设备上自由访问互联网。但对于Web开发人员&#xff0c;…

stable diffusion controlnet前处理中的图像resize

在SD controlnet应用中&#xff0c;一般都要先安装controlnet_aux&#xff0c;并在项目代码中import相关前处理模块&#xff0c;如下所示。 在对control image进行前处理&#xff08;比如找边缘&#xff0c;人体特征点&#xff09;之前&#xff0c;往往会图像进行resize&#x…

Ollama配置webui连接大预言模型

Ollama配置Web UI连接大预言模型 默认ollama安装后&#xff0c;chat对话只有命令行界面&#xff0c;交互体验较差。借助open-webui可以通过web界面连接ollama&#xff0c;从而实现类似chatgpt式的web交互体验。 使用家用PC实践记录如下&#xff1a; 1. 环境配置 本次使用的操作…

python学习笔记----数据容器(六)

一、数据容器的入门 python中的数据容器&#xff1a;一种可以容纳多份数据的数据类型&#xff0c;容纳的每一份数据称之为1个元素。每一个元素&#xff0c;可以是任意类型的数据&#xff0c;如字符串、数字、布尔等。 数据容器根据特点的不同&#xff0c;如&#xff1a; 是否…

JAVA自定义日期选择器

下载jar地址&#xff0c; https://toedter.com/jcalendar/ jar包下载地址 依赖包如下图所示&#xff1a; 整个项目代码已经上传到CSDN https://download.csdn.net/download/qq_30273575/89241601?ydrefereraHR0cHM6Ly9tcC5jc2RuLm5ldC9tcF9kb3dubG9hZC9tYW5hZ2UvZG93bmxvYWQ…

由异常的测试眼图引发的深入思考

最近的信号测试中&#xff0c;出现了“双眼皮”的眼图测试效果&#xff0c;直觉告诉我&#xff0c;这肯定是有问题的&#xff0c;于是&#xff0c;脑海中就出现了很多的场景假设&#xff0c;并将可能的导致因素总结如下&#xff1a; 1. PCB通道阻抗设计不匹配&#xff0c;负载端…

Windows 本地直接使用 SSH,SFTP 以及 SFTP下载文件到 Windows/mac 本地或上传(没有客户端时)

windows 本地打开 ssh 以及 sftp 等的方式 1.win(windows图标那个键) r 直接搜 然后从打开的位置运行 如果是打开 sftp 前面的 ssh 换一下成sftp 就行 直接从地址栏输入也可以直接转过去 通过 windows 的工具直接访问 sftp 后将文件下载到自己的windows 或 mac 上 先通过…

Pandas 2.2 中文官方教程和指南(二十五·一)

原文&#xff1a;pandas.pydata.org/docs/ 食谱 原文&#xff1a;pandas.pydata.org/docs/user_guide/cookbook.html 这是一个简短而精炼的示例和链接存储库&#xff0c;包含有用的 pandas 示例。我们鼓励用户为此文档添加内容。 在这一部分添加有趣的链接和/或内联示例是一个…

《Spring-MVC》系列文章目录

简介 Spring MVC是一种基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;它通过把Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;、Controller&#xff08;控制器&#xff09;分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂…

计算机视觉大项目(1)-水果分级系统

项目来源&#xff1a;河北大学计算机视觉课程-杨老师. 一共有四个标题&#xff0c;本篇博客只完成前两问。 目录 实验目的: 实验内容&#xff1a; 实验步骤&#xff1a; 1.水果图像的分割 >掩膜图像Mask 是什么&#xff1f; >改进:去除反光部分的影响 2&#xf…

打造智能化且用户体验上乘的企业展馆需关注哪些细节?

随着科技的进步&#xff0c;传统展馆的设计理念和展陈方式已逐渐暴露出不足&#xff0c;为了让企业展馆在新时代焕发出更加璀璨的光彩&#xff0c;我们亟待在展馆的创新设计、智能化展示以及人性化布局等多个层面进行深入探索。那么&#xff0c;究竟需要精心打磨哪些细节&#…

【网站项目】家庭理财系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

(css)鼠标移出样式不变

(css)鼠标移出样式不变 需求&#xff1a;列表鼠标移入切换样式&#xff0c;移出保持不变 <divv-for"(item, index) of newsList":key"index"class"news-list":class"{active : change index}"tabindex"1"mouseenter&quo…

Webshell绕过技巧分析之-base64编码和压缩编码

在网络安全运营&#xff0c;护网HVV&#xff0c;重保等活动的过程中&#xff0c;webshell是一个无法绕过的话题。通常出现的webshell都不是以明文的形式出现&#xff0c;而是针对webshell关键的内容进行&#xff0c;混淆&#xff0c;编码来绕过网络安全产品&#xff0c;例如IDS…

好用到哭的AI工具,你知道几个?

随着人工智能技术的不断发展&#xff0c;越来越多的AI工具被广泛应用到我们的日常生活和工作中&#xff0c;给人们带来了极大的便利。本文将探讨人们在使用AI工具时&#xff0c;最喜欢的和认为最好用的工具是哪些&#xff0c;并展示AI技术的实际应用和影响。 让我们关注一下AI…

聊聊Mysql的两阶段提交

从图中可看出&#xff0c;事务的提交过程有两个阶段&#xff0c;就是将 redo log 的写入拆成了两个步骤&#xff1a;prepare 和 commit&#xff0c;中间再穿插写入bin log&#xff0c;具体如下&#xff1a; prepare 阶段&#xff1a;将 事务的修改写入到 redo log&#xff0c;同…

SpringBoot之自定义注解参数校验

SpringBoot之自定义注解参数校验 为什么要自定义注解 我这里先引入一个例子&#xff0c;就比如我现在要写文章&#xff0c;文章也许写完正要发布&#xff0c;也可以是还没写完正要存草稿&#xff0c;前端往后端发送数据&#xff0c;如果前端的state不是草稿或者已发布状态&…

HTML:认识HTML及基本语法

目录 1. HTML介绍 2. 关于软件选择和安装 3. HTML的基本语法 1. HTML介绍 HyperText Markup Language 简称HTML&#xff0c;意为&#xff1a;超文本标记语言 超文本&#xff1a;是指页面内可以包含的图片&#xff0c;链接&#xff0c;声音&#xff0c;视频等内容 标记&am…

【开发者好用插件】基于百度文心大模型,前端,后端,开发者的辅助神器

基于百度文心大模型&#xff0c;前端&#xff0c;后端&#xff0c;开发者的辅助神器&#xff0c;百度AI代码生成器&#xff0c;个人用户免费&#xff0c;可以提问&#xff0c;写注释&#xff0c;等等&#xff0c;新手必备神器啊 智能代码助手&#xff08;Baidu Comate&#xf…