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):