马上深挖!!!三段逆置如何实现数组轮转?!用最简单的话让你秒懂
一、目的给定一个数组和一个整数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; *btmp; return; } void reverse(int* a,int begin,int end) { int leftbegin,rightend; while(leftright) { swap(aleft,aright); 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 i0;ilen;i) coutarr[i] ; return; } int arr[]{1,2,3,4,5,6,7}; int nsizeof(arr)/sizeof(arr[0]); int main() { show(arr,sizeof(arr)/sizeof(arr[0])); Rotate(arr,n,4); coutendl; 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进行处理若ksize则会造成数组的越界无法实现正常的轮转。所以根据处理“周期性问题”的通法对k取模k%size让k处于范围0~size-1内便能在k过大时实现正常的轮转。五、触类旁通如果想让数组ABC变成CBA呢同样的思路我们对ABC整体逆置变成*C*B*A再对三部分分别逆置即可变成CBA可见“整体逆置部分逆置”的思路可以处理很多“交换数组内部顺序”的问题把它牢记在心里一起解决更多问题吧。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2474813.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!