面试经典算法系列之数组/字符串6 -- 轮转数组

面试经典算法题38-轮转数组

LeetCode.189
公众号:阿Q技术站

问题描述

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

思路

  1. 处理 k 大于数组长度的情况,因为旋转一个长度为 n 的数组 n 次,得到的结果和原数组相同。

  2. 可以通过三次翻转实现数组的旋转。首先,将整个数组翻转;然后,将前 k 个元素翻转;最后,将剩余的元素翻转。

图解

        +-----------------------------------------+|               开始执行程序               |+-----------------------------------------+|v+-----------------------------------------+|     输入: nums = [1,2,3,4,5,6,7], k = 3  |+-----------------------------------------+|v+-----------------------------------------+|        处理 k 大于数组长度的情况            ||        k %= 7,得到 k = 3                |+-----------------------------------------+|v+-----------------------------------------+|        定义反转数组的函数 reverse()        |+-----------------------------------------+|v+-----------------------------------------+|        定义反转部分数组的函数               || reverse(nums.begin(), nums.begin() + k) |+-----------------------------------------+|v+-----------------------------------------+|          定义反转剩余部分数组的函数         ||   reverse(nums.begin() + k, nums.end()) |+-----------------------------------------+|v+-----------------------------------------+|             打印当前数组状态               ||            [1,2,3,4,5,6,7]              |+-----------------------------------------+|v+-----------------------------------------+|        调用 reverse() 反转整个数组         ||            [7,6,5,4,3,2,1]              |+-----------------------------------------+|v+-----------------------------------------+|              打印当前数组状态              ||              [7,6,5,4,3,2,1]            |+-----------------------------------------+|v+-----------------------------------------+|        调用 reverse() 反转前 k 个元素      ||             [5,6,7,4,3,2,1]             |+-----------------------------------------+|v+-----------------------------------------+|              打印当前数组状态             ||              [5,6,7,4,3,2,1]            |+-----------------------------------------+|v+-----------------------------------------+|        调用 reverse() 反转剩余元素         ||              [5,6,7,1,2,3,4]            |+-----------------------------------------+|v+-----------------------------------------+|              打印当前数组状态              ||             [5,6,7,1,2,3,4]             |+-----------------------------------------+|v+-----------------------------------------+|                返回结果                  |+-----------------------------------------+

参考代码

C++
#include <iostream>
#include <vector>using namespace std;class Solution {
public:void rotate(vector<int>& nums, int k) {int n = nums.size();k %= n; // 处理 k 大于数组长度的情况if (k == 0) return; // 如果 k 等于 0,直接返回// 翻转整个数组reverse(nums.begin(), nums.end());// 翻转前 k 个元素reverse(nums.begin(), nums.begin() + k);// 翻转剩余元素reverse(nums.begin() + k, nums.end());}
};int main() {vector<int> nums = {1, 2, 3, 4, 5, 6, 7}; // 输入数组int k = 3; // 向右轮转的位置数Solution solution;solution.rotate(nums, k); // 调用 rotate 方法cout << "旋转后的数组:";for (int num : nums) {cout << num << " ";}cout << endl;return 0;
}
Java
import java.util.Arrays;class Solution {public void rotate(int[] nums, int k) {int n = nums.length;k %= n; // 处理 k 大于数组长度的情况if (k == 0) return; // 如果 k 等于 0,直接返回// 翻转整个数组reverse(nums, 0, n - 1);// 翻转前 k 个元素reverse(nums, 0, k - 1);// 翻转剩余元素reverse(nums, k, n - 1);}private void reverse(int[] nums, int start, int end) {while (start < end) {int temp = nums[start];nums[start] = nums[end];nums[end] = temp;start++;end--;}}public static void main(String[] args) {int[] nums = {1, 2, 3, 4, 5, 6, 7}; // 输入数组int k = 3; // 向右轮转的位置数Solution solution = new Solution();solution.rotate(nums, k); // 调用 rotate 方法System.out.print("旋转后的数组:");for (int num : nums) {System.out.print(num + " ");}System.out.println();}
}
Python
class Solution:def rotate(self, nums: List[int], k: int) -> None:n = len(nums)k %= n  # 处理 k 大于数组长度的情况if k == 0:return  # 如果 k 等于 0,直接返回# 翻转整个数组self.reverse(nums, 0, n - 1)# 翻转前 k 个元素self.reverse(nums, 0, k - 1)# 翻转剩余元素self.reverse(nums, k, n - 1)def reverse(self, nums: List[int], start: int, end: int) -> None:while start < end:nums[start], nums[end] = nums[end], nums[start]start += 1end -= 1if __name__ == "__main__":nums = [1, 2, 3, 4, 5, 6, 7]  # 输入数组k = 3  # 向右轮转的位置数solution = Solution()solution.rotate(nums, k)  # 调用 rotate 方法print("旋转后的数组:", nums)

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

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

相关文章

YOLOv8训练流程-原理解析[目标检测理论篇]

关于YOLOv8的主干网络在YOLOv8网络结构介绍-CSDN博客介绍了&#xff0c;为了更好地学习本章内容&#xff0c;建议先去看预测流程的原理分析YOLOv8原理解析[目标检测理论篇]-CSDN博客&#xff0c;再次把YOLOv8网络结构图放在这里&#xff0c;方便随时查看。 ​ 1.前言 YOLOv8训练…

Map中KEY去除下划线并首字母转换为大写工具类

在运维旧项目时候&#xff0c;碰上sql查询结果只能返回List<Map>&#xff0c;key为表单字段名&#xff0c;value为获取到的结果数据。 懒得一个一个敲出来&#xff0c;就直接写个方法转换&#xff0c;并赋值到相应实体对象里去。 Map中KEY去除下划线并首字母转换为大写&…

算法提高之矩阵距离

算法提高之矩阵距离 核心思想&#xff1a;多源bfs 从多个源头做bfs&#xff0c;求距离 先把所有1的坐标存入队列 再把所有1连接的位置存入 一层一层求 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 1…

Kafka 面试题(八)

1. Kafka&#xff1a;硬件配置选择和调优的建议 &#xff1f; Kafka的硬件配置选择和调优是确保Kafka集群高效稳定运行的关键环节。以下是一些建议&#xff1a; 硬件配置选择&#xff1a; 内存&#xff08;RAM&#xff09;&#xff1a;建议至少使用32GB内存的服务器。为Kafk…

Web3Tools - 助记词生成

Web3Tools - 助记词生成工具 本文介绍了一个简单的助记词生成工具&#xff0c;使用 React 和 Material-UI 构建。用户可以选择助记词的语言和长度&#xff0c;然后生成随机的助记词并显示在页面上 功能介绍 选择语言和长度&#xff1a; 用户可以在下拉菜单中选择助记词的语言&…

uniapp 图片添加水印代码封装(优化版、图片上传压缩、生成文字根据页面自适应比例、增加文字背景色

uniapp 图片添加水印代码封装(优化版、图片上传压缩、生成文字根据页面自适应比例、增加文字背景色 多张照片上传封装 <template><view class"image-picker"><uni-file-picker v-model"imageValue" :auto-upload"false" :title…

关于服务端接口知识的汇总

大家好&#xff0c;今天给大家分享一下之前整理的关于接口知识的汇总&#xff0c;对于测试人员来说&#xff0c;深入了解接口知识能带来诸多显著的好处。 一、为什么要了解接口知识&#xff1f; 接口是系统不同模块之间交互的关键通道。只有充分掌握接口知识&#xff0c;才能…

http-server实现本地服务器

要实现一个本地服务器&#xff0c;你可以使用Node.js的http-server模块。首先&#xff0c;确保你已经安装了Node.js和npm。然后&#xff0c;按照以下步骤操作&#xff1a; 打开终端或命令提示符&#xff0c;进入你想要作为服务器根目录的文件夹&#xff1b;运行以下命令安装ht…

Axure PR 10 制作顶部下拉三级菜单和侧边三级菜单教程和源码

在线预览地址&#xff1a;Untitled Document 2.侧边三级下拉菜单 在线预览地址&#xff1a;Untitled Document 文件包和教程下载地址&#xff1a;https://pan.quark.cn/s/77e55945bfa4 程序员必备资源网站&#xff1a;天梦星服务平台 (tmxkj.top)

Linux x86_64 dump_stack()函数基于FP栈回溯

文章目录 前言一、dump_stack函数使用二、dump_stack函数源码解析2.1 show_stack2.2 show_stack_log_lvl2.3 show_trace_log_lvl2.4 dump_trace2.5 print_context_stack 参考资料 前言 Linux x86_64 centos7 Linux&#xff1a;3.10.0 一、dump_stack函数使用 dump_stack函数…

Unity开发中导弹路径散射的原理与实现

Unity开发中导弹路径散射的原理与实现 前言逻辑原理代码实现导弹自身脚本外部控制脚本 应用效果结语 前言 前面我们学习了导弹的追踪的效果&#xff0c;但是在动画或游戏中&#xff0c;我们经常可以看到导弹发射后的弹道是不规则的&#xff0c;扭扭曲曲的飞行&#xff0c;然后击…

数字生态系统的演进与企业API管理的关键之路

数字生态系统的演进与企业API管理的关键之路 在数字化时代&#xff0c;企业正经历着一场转型的浪潮&#xff0c;而API&#xff08;应用程序编程接口&#xff09;扮演着至关重要的角色。API如同一座桥梁&#xff0c;将组织内部的价值转化为可市场化的产品&#xff0c;从而增强企…

韩国站群服务器在全球网络架构中的重要作用?

韩国站群服务器在全球网络架构中的重要作用? 在全球互联网的蓬勃发展中&#xff0c;站群服务器作为网络架构的核心组成部分之一&#xff0c;扮演着至关重要的角色。韩国站群服务器以其卓越的技术实力、优越的地理位置、稳定的网络基础设施和强大的安全保障能力&#xff0c;成…

LeetCode 题目 118:杨辉三角

题目描述 给定一个非负整数 numRows&#xff0c;生成杨辉三角的前 numRows 行。在杨辉三角中&#xff0c;每个数是它左上方和右上方的数的和。 杨辉三角解析 在这个详解中&#xff0c;我们将使用 ASCII 图形来说明杨辉三角的构建过程&#xff0c;包括逐行添加新的行的过程。…

250 基于matlab的5种时频分析方法((短时傅里叶变换)STFT

基于matlab的5种时频分析方法&#xff08;(短时傅里叶变换)STFT,Gabor展开和小波变换,Wigner-Ville&#xff08;WVD&#xff09;,伪Wigner-Ville分布(PWVD),平滑伪Wigner-Ville分布&#xff08;SPWVD&#xff09;,每条程序都有详细的说明&#xff0c;设置仿真信号进行时频输出。…

Parted分区大容量磁盘

创建了新的虚拟磁盘10T , 挂载后分区格式化一.fdisk无法创建大容量的分区 Fileserver:~ # fdisk /dev/sdb Welcome to fdisk (util-linux 2.29.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device …

使用html和css实现个人简历表单的制作

根据下列要求&#xff0c;做出下图所示的个人简历&#xff08;表单&#xff09; 表单要求 Ⅰ、表格整体的边框为1像素&#xff0c;单元格间距为0&#xff0c;表格中前六列列宽均为100像素&#xff0c;第七列 为200像素&#xff0c;表格整体在页面上居中显示&#xff1b; Ⅱ、前…

git提交代码异常报错error:bad signature 0x00000000

报错信息 error:bad signature 0x00000000 异常原因 git 提交过程中异常关机或重启&#xff0c;造成当前项目工程中的.git/index 文件损坏&#xff0c;无法提交 解决步骤 删除.git/index文件 rm -f .git/index 重启git git reset

Java 【数据结构】 哈希(Hash超详解)HashSetHashMap【神装】

登神长阶 第十神装 HashSet 第十一神装 HashMap 目录 &#x1f454;一.哈希 &#x1f9e5;1.概念 &#x1fa73;2.Object类的hashCode()方法: &#x1f45a;3.String类的哈希码: &#x1f460;4.注意事项: &#x1f3b7;二.哈希桶 &#x1fa97;1.哈希桶原理 &#x…

Bert基础(二十二)--Bert实战:对话机器人

一 、概念简介 1.1 生成式对话机器人 1.1.1什么是生成式对话机器人? 生成式对话机器人是一种能够通过自然语言交互来理解和生成响应的人工智能系统。它们能够进行开放域的对话,即在对话过程中,机器人可以根据用户的需求和上下文信息,自主地生成新的、连贯的回复,而不仅…