令A为一个由N个已特殊排序数组成的数列:A1,A2,…,AN,其中A1=0。令B为N(N-1)/2个数(定义为Dij=Ai-Aj(i>j))组成的数列。例如,A=0,1,5,8,那么D=1,3,4,5,7,8。请完成:
a) 编写程序,根据A构造D;
b) 编写程序,构造与D相对应的某一个数列A,注意A不是唯一的
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArrayDemo {
public static void main(String[] args) {
Integer[] aArray = new Integer[] { 0, 1, 5, 8 };
// 第一步获取D数组
System.out.println("根据A计算得到的数组D:");
Integer[] dArray = getDArray(aArray);
for (int i = 0; i < dArray.length; i++) {
System.out.println(dArray[i]);
}
// 第二步根据D数组反求A数组
System.out.println("反求得到的数组A:");
Integer[] _aArray = getAArray(dArray);
for (int i = 0; i < _aArray.length; i++) {
System.out.println(_aArray[i]);
}
}
/**
* 构造与D相对应的某一个数列A,注意A不是唯一的
*
* @param dArray
* @return
*/
private static Integer[] getAArray(Integer[] dArray) {
int dLen = dArray.length;
int aLen = getALen(dLen);
if (aLen == 0) {
System.err.println("计算A的数组出错,请确认传入的D数组有效。");
return null;
}
// 因为A1必须为0,可以直接确定A1,并设置A最后一个值为D的最后一个值,保证了最大值。同时A2=A1+D1,A3=A2+D2,依次类推,认为D是有序数组,遍历D数组得到中间A的所有数据
Integer[] aArray = new Integer[aLen];
aArray[0] = 0;
aArray[aLen - 1] = dArray[dLen - 1];
for (int i = 1; i < aLen - 1; i++) {
aArray[i] = aArray[i - 1] + dArray[i];
}
return aArray;
}
/**
* 根据传入的D数组的长度求出A数组的长度来,就是解一元二次方程n*n-n=2*dLen,n代表A数组的长度
*
* @param dLen
* @return
*/
private static int getALen(int dLen) {
for (int n = 2; n <= 2 * dLen; n++) {
if (n * n - n - 2 * dLen == 0) {
return n;
}
}
return 0;
}
/**
* 令aArray为一个由N个已特殊排序数组成的数列:A1,A2,…,AN,其中A1=0。令D为N(N-1)/2个数(定义为Dij=Ai-Aj(i>j
* )组成的数列。例如,A=0,1,5,8,那么D=1,3,4,5,7,8
*
* @param aArray
* @return
*/
private static Integer[] getDArray(Integer[] aArray) {
int aLen = aArray.length;
int dLen = aLen * (aLen - 1) / 2;
List<Integer> tempList = new ArrayList<Integer>();
for (int i = 0; i < aArray.length; i++) {
for (int j = i + 1; j < aArray.length; j++) {
if (tempList.size() == dLen) {
i = aLen;
break;
} else {
tempList.add(aArray[j] - aArray[i]);
}
}
}
Integer[] dArray = tempList.toArray(new Integer[0]);
Arrays.sort(dArray);
return dArray;
}
}
不断从D中找出最大的数k,尝试k和x-k,将符合条件的数加入A,并将D中已知的与k相关的差删掉;
这东西我看了,只是在“符合条件的数”和“将D中已知的与k相关的差删掉”不理解,怎样判定符合条件?