输入一个int类型的值N,构造一个长度为N的数组arr并返回
要求:对任意的i < k < j,都满足arr[i] + arr[j] != arr[k] * 2
public class MakeNo {
/**
* 思路:假定有一个数组满足上述条件,对这个数组进行奇变换和偶变换得到的数组同样符合条件,
* 将奇变换和偶变换得到的数组合并到一起也是满足条件的
*/
public static int[] markNo(int size) {
if (size == 1) {
return new int[]{1};
}
int halfSize = (size + 1) / 2;
int[] base = markNo(halfSize);
int[] ans = new int[size];
int index = 0;
// 一半变为基数
for (int i = 0; index < halfSize; i++, index++) {
ans[index] = (base[i] * 2 + 1);
}
// 另一半变成偶数
for (int i = 0; index < size; i++, index++) {
ans[index] = (base[i] * 2);
}
return ans;
}
// 对生成的数组进行测试
private static boolean testSample(int[] arr) {
int length = arr.length;
for (int i = 0; i < length; i++) {
for (int k = i + 1; k < length; k++) {
for (int j = k + 1; j < length; j++) {
if (arr[i] + arr[j] == arr[k] * 2) {
return false;
}
}
}
}
return true;
}
public static void main(String[] args) {
System.out.println("test begin");
for (int i = 1; i < 1000; i++) {
int[] arr = markNo(i);
if (!testSample(arr)) {
System.out.println("Oops");
}
}
System.out.println("test end");
}
}