Day40:数据位置变换

125 阅读2分钟

day40-数据位置变换

【2009统考真题】设将n(n>1)个整数存放到一维数组R中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(xO,x1,x2...xn-1)变换为(xp,xp+1,…….. xO, x1, .... xp-1)要求:

1)给出算法的基本设计思想。 2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。 3)说明你所设计算法的时间复杂度和空间复杂度。

题源:408考研2009年数据结构真题

1、思路

创建一个辅助数组,然后分别利用两次循环,往里面填数 创建一个辅助变量,表示辅助数组的下标,记录位置 遍历目标数组p后面的项,然后放到辅助数组里面; index++ index用来记录位置,并且当temp数组的下标,用来存放值 第二次从下标0开始遍历到index (index已经记录好辅助数组遍历到的位置) 如果index还是小于该数组的长度,说明没有遍历完

2、具体实现

public static int[] f(int[] array, int p){
    //创建一个辅助数组来存储
    int temp[] = new int[array.length];
    //创建一个辅助变量,表示辅助数组的下标,记录位置
    int index = 0;
    //遍历目标数组p后面的项,然后放到辅助数组里面;
    for (int i = p;i < array.length;i++){
    //index++ index用来记录位置,并且当temp数组的下标,用来存放值
        temp[index++] = array[i];
    }
    //第二次从下标0开始遍历到index
    //(index已经记录好辅助数组遍历到的位置)
    //如果index还是小于该数组的长度,说明没有遍历完
    for (int i = 0; i < temp.length;i++){
        if (index != i && index != array.length){
        //index仍随i自增;
            temp[index++] = array[i];
        }
    }
    //返回辅助数组
    return temp;
}

时间复杂度:O(n);

空间复杂度:O(n):