【正确答案】
【答案解析】假设要把数组序列12345678右移2位变为78123456,比较移位前后数组序列的形式,不难看出,其中有两段序列的顺序是不变的,即78和123456,可以把这两段看作两个整体,右移k位就是把数组的两部分交换一下。鉴于此,可以设计这样一种算法,步骤如下(以数组序列12345678为例):
1)逆序数组子序列123456,数组序列的形式变为65432178。
2)逆序数组子序列78,数组序列的形式变为65432187。
3)全部逆序,数组序列的形式变为78123456。
程序代码如下:
public class Test{
public static void reverse(int a[], int b, int e){
for(; b<e; b++, e--){
int temp=a[e];
a[e]=a[b];
a[b]=temp;
}
}
public static void shift_k(int a[], int k){
int n=a.length;
k=k%n;//为了防止k比n大,右移k位跟右移k%n位的结果是一样的
reverse(a, n-k, n-1);
reverse(a, 0, n-k-1);
reverse(a, 0, n-1);
}
public staric void main(String[]args){
int array[]={1, 2, 3, 4, 5, 6, 7, 8};
shift_k(array, 2);
for(int i=0; i<array.length; i++){
System.out.print(array[i]+"");
}
}
}
程序运行结果如下:
7 8 1 2 3 4 5 6
从上例中可以看出,该算法只进行了3次逆序操作,因此时间复杂度为O(n)。