1)题目:设将n(n>1)个整数存放到一维数组R中,设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(X0,X1......Xn-1)变换成(Xp,Xp+1,......Xn-1,X0,X1......Xp-1)。
2)思路:
1、将第一个数据存储到一个临时变量上;
2、将每个已经被复制过的数据的后第p个数据移到该数据位置直到下一个位置为第一个数据;
3、将临时变量上的数据填充到最后一个被复制数据的位置
4、重复步骤2和3列表大小什么和p的公约数次 * 时间复杂度O(n) * 空间复杂度O(1)
3)代码:
源码中使用到的ArrrayList,是调用的是自己实现的ArrayList,自己实现的ArrayList源码地址:https://blog.youkuaiyun.com/u012441545/article/details/89667486
package com.sam.datastruct.arrayList;
import java.util.Random;
public class P2_10 {
/*
* 思路:1、将第一个数据存储到一个临时变量上;
* 2、将每个已经被复制过的数据的后第p个数据移到该数据位置直到下一个位置为第一个数据;
* 3、将临时变量上的数据填充到最后一个被复制数据的位置
* 4、重复步骤2和3列表大小什么和p的公约数次
* 时间复杂度O(n)
* 空间复杂度O(1)*/
public void function(ArrayList<Integer> R, int p){
System.out.println("p : " + p);
if (p <= 0 || p > R.size()) {
return;
}
int index = 0;
int count = get(R.size(), p);
for(int i = 0; i < count; ++i){
index = i;
int tmp = R.get(index);
while((index + p) % R.size() != i){
R.update(R.get((index + p) % R.size()), index);
index = (index + p) % R.size();
}
R.update(tmp, index);
}
}
public int get(int a, int b){
if (a % b == 0) {
return b;
}
return get(b, a % b);
}
public static void main(String[] args) {
P2_10 p = new P2_10();
ArrayList<Integer> list = new ArrayList<>();
Random random = new Random();
int m = random.nextInt(200);
list.initacs(m);
int x = random.nextInt(list.size());
p.function(list, x);
System.out.println(list.toString());
}
}