O(n)时间解决的面试题:循环移位

问题描述

   

一个数组或者一个字符串,比如12345循环移动一位就是23451,再循环移动一位就是34512,问循环移动m位之后,数组或者字符串变成什么样

   

分析问题

   

首先我们需要弄明白一个问题,那就是循环移动m位和循环移动m%n位是一样的

   

我们可以不断地循环移动,每次将数组中的元素右移一位,循环m%n次,那么时间复杂度为n^2

   

RightShift(int* arr,int N,int m){

while(m--){

int t=arr[N-1];

for(int i=N-1;i>0;i--){

arr[i]=arr[i-1];

}

arr[0]=t;

}

}

   

另外还有一种线性的算法,该算法的策略师先翻转前m位,然后翻转后n-m位,最后将所有的都翻转一下

   

算法实现

   

Reverse(int* arr,int b,int e){

for(;b<e;b++,e--){

int temp=arr[e];

arr[e]=arr[b];

arr[b]=temp;

}

}

ReverseShift(int* arr,int N,int m){

m%=N;

Reverse(arr,0,N-k-1);

Reverse(arr,N-k,N-1);

Reverse(arr,0,N-1);

}

原文地址:https://www.cnblogs.com/keedor/p/4529054.html