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

马上深挖!!!三段逆置如何实现数组轮转?!用最简单的话让你秒懂

一、目的

给定一个数组和一个整数k,让数组向右轮转k个数。如令[1,2,3,4,5,6]向右轮转3个数,结果为[4,5,6,1,2,3]。

二、代码

#include <iostream> using namespace std; void swap(int* a,int* b) { int tmp=*a; *a=*b; *b=tmp; return; } void reverse(int* a,int begin,int end) { int left=begin,right=end; while(left<right) { swap(a+left,a+right); left++; right--; } return; } void Rotate(int* a,int size,int k) { k%=size; //数组整体逆置 reverse(a,0,size-1); //对*B逆置 reverse(a,0,k); //对*A逆置 reverse(a,k,size-1); return; } void show(int* arr,int len) { for(int i=0;i<len;i++) cout<<arr[i]<<" "; return; } int arr[]={1,2,3,4,5,6,7}; int n=sizeof(arr)/sizeof(arr[0]); int main() { show(arr,sizeof(arr)/sizeof(arr[0])); Rotate(arr,n,4); cout<<endl; show(arr,n); return 0; }

三、解析

首先,我们把数组arr分成两段:第一段为A,长度k,剩下的部分作为第二段B。现在,如果A和B内部都只有一个数字,那么要实现arr逆序,只需arr整体逆序(即,让AB变成BA)。

理解了A、B都是单个元素的情况之后,我们就可以推广到A、B包含多个元素的情况。

当A、B包含多个元素时:延续之前的思路,我们对arr整体逆置注意!当A、B包含多个元素,对arr整体逆置不仅会对调 A、B的位置,还会让A、B内部分别发生逆置。我们设A逆置的结果为A*,B逆置的结果为B*,则数组从AB变成了B*A*,此时,为了实现我们的目标(即BA),只需再对*B和*A分别进行一次逆置,就可让*B*A变成BA,完成!

四、细节

数组的轮转就一个转盘:若向右轮转的位数k等于arr的长度size,则会轮转一圈,回到原来的样子。所以,考虑到这个问题的“周期性”,我们需要对k进行处理:若k>=size,则会造成数组的越界,无法实现正常的轮转。所以,根据处理“周期性问题”的通法,对k取模(k%=size),让k处于范围0~size-1内,便能在k过大时实现正常的轮转。

五、触类旁通

如果想让数组ABC变成CBA呢?同样的思路,我们对ABC整体逆置,变成*C*B*A,再对三部分分别逆置,即可变成CBA!

可见,“整体逆置+部分逆置”的思路可以处理很多“交换数组内部顺序”的问题,把它牢记在心里,一起解决更多问题吧。

http://www.jsqmd.com/news/575026/

相关文章:

  • 3个步骤实现Office文档在线预览:解决Web应用中的文件查看难题
  • 新手入门:在快马平台生成代码,理解智能应用控制警告的模拟实现
  • Graphormer多场景教程:学术论文配图生成、课程教学演示、项目原型开发
  • 3步重置JetBrains IDE试用期:开发者必备效率工具指南
  • 三大AI模型实战评测:Grok3、DeepSeek R1、ChatGPT o1在不同场景下的表现差异
  • Hotkey Detective:Windows系统热键冲突定位与解决工具
  • Open Event Server社区贡献指南:如何参与开源项目开发
  • 终极指南:如何用WebPlotDigitizer从图表图片中提取数据
  • 终极指南:用OpenCore Legacy Patcher让老Mac重获完美音质体验
  • 抛开Transformer,我们还能如何理解Attention机制?
  • HUNYUAN-MT 7B翻译终端Java集成指南:SpringBoot微服务调用实战
  • 30天重置一次:JetBrains IDE评估期管理工具使用指南
  • 3步定位Windows热键冲突:Hotkey Detective实用指南
  • 如何快速搭建多平台直播录制系统:从零到一的完整指南
  • Notepad++ 与AI结合:快速编辑忍者像素绘卷提示词配置文件
  • DLSS Swapper终极指南:5分钟学会游戏性能优化新技能
  • 告别“AI只会聊天”:用OpenClaw+星链4SAPI打造你的办公自动化Agent
  • 用Python手搓一个简易飞行仿真器:从状态机到轨迹计算的保姆级教程
  • claude code 泄密源码深度解析
  • 实战指南:怎样使用DeepSeek Coder提升5倍编程效率
  • 基于ADP自适应动态规划算法的控制系统matlab性能仿真,采用RNN进行控制对象参数辨识
  • 抖音批量下载工具:高效解决方案与实战指南
  • 告别卡顿与丢帧:手把手教你用MOTRv2+YOLOX搞定复杂舞蹈场景下的多人跟踪
  • 解锁Unity游戏无限可能:7个步骤掌握MelonLoader模组加载技术
  • 德希科技在线污泥浓度传感器
  • 为什么你的微信聊天记录需要立即备份?5步轻松搞定永久保存
  • Python命名规范
  • 千问3.5-2B部署案例:中小企业低成本视觉AI助手,单卡GPU即可上线
  • zteOnu:3步解锁ZTE ONU工厂模式,网络运维效率提升300%
  • OneNote UWP版离线安装保姆级教程:从下载appxbundle到PowerShell部署全流程