2019多益网络秋招视频面试算法题:将一个长度为n的数组A的元素循环右移k位

题目:将一个长度为n的数组A的元素循环右移k位 比如数组 1, 2, 3, 4, 5 循环右移3位之后变成 3, 4, 5, 1, 2

方法一:

    首先考虑k。如果k能被数组长度len整除,那么数组顺序不变,可以直接输出数组。如果不能整除,得到k=k%len。

将数组右移k次,每次都把数组最后一位保存,然后从下标为len-2到0的数都往右移动一位,最后把原来最后一位放到数组开头。

public void CircleRightK(int[] A,int k){
        int len=A.length;
        k=k%len;
        if(k==0)    return;
        while(k>0){
            int temp=A[len-1];   //每次保存最后一位
            for(int i=len-1;i>0;i--){
                A[i]=A[i-1];
            }
            A[0]=temp;
            k--;
        }
    }

方法二:考虑将数组逆序,然后把数组分为两部分,前半部分为前k个数,后半部分为剩下的数,再分别对他们进行逆序。

public void CircleRightK1(int[] A,int k){
        int len=A.length;
        k=k%len;
        if(k==0)    return;
        reverse(A,0,len-1);  //逆置数组
        reverse(A,0,k-1);
        reverse(A,k,len-1);

    }

    public static void  reverse(int[] A,int i,int j){
        while(i<j){
            int temp=A[i];
            A[i]=A[j];
            A[j]=temp;
            i++;
            j--;
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_27139155/article/details/80918054
今日推荐