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);
}