【发布时间】:2018-04-18 20:20:09
【问题描述】:
例子:
[1,2,4,5] 输出将是 [1,5] 和 [2,4]
所以这是我尝试过的,但是代码中断在某一点需要帮助来做出决策。从下面的代码 if(avgArr1 是我决定哪些需要是源数组,它需要成为插入和删除元素的目标数组。此条件不可靠,会清空其中一个数组。
package test;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.IntStream;
public class ArrayAvg {
static int[] arr1;
static int[] arr2;
public Map<String,int[]> swap(int[] src,int[] dest,int num,boolean swapLeft){
Map<String,int[]> arrMap = new HashMap<String,int[]>();
System.out.println("num"+num);
///System.out.println(Arrays.toString(src));
///System.out.println(Arrays.toString(dest));
int[] tempL;
int[] tempR;
int myNumber = num;
int distance = Math.abs(src[0] - myNumber);
int idx = 0;
for(int c = 1; c < src.length; c++){
int cdistance = Math.abs(src[c] - myNumber);
if(cdistance < distance){
idx = c;
distance = cdistance;
}
}
int theNumber = src[idx];
System.out.println("the num"+theNumber);
if(swapLeft){
tempL= new int[dest.length+1];
tempR= new int[src.length-1];
tempR = Arrays.stream( src ).filter( value -> value != theNumber ).toArray();
//System.out.println(Arrays.toString(tempR));
tempL = Arrays.copyOf(dest, dest.length+1);//Range(dest, 0, src.length);
tempL[tempL.length-1] = theNumber;
//*/System.arraycopy(dest, 0, tempL, 1, 2);*/
//System.out.println(tempL.length+1);
//System.out.println(Arrays.toString(tempL));
arr1 = tempL;
arr2 = tempR;
}else{
tempL= new int[src.length-1];
tempR= new int[dest.length+1];
tempR = Arrays.stream( src ).filter( value -> value != theNumber ).toArray();
tempL = Arrays.copyOfRange(dest, 0, src.length);
tempL[tempL.length-1] = num;
arr1 = tempR;
arr2 = tempL;
}
/*dest = tempL;
src = tempR;*/
arrMap.put("arr1", arr1);
arrMap.put("arr2", arr2);
//System.out.println(Arrays.toString(tempL));
//System.out.println(Arrays.toString(arr1));
System.out.println(Arrays.toString(arr1));
System.out.println(Arrays.toString(arr2));
//System.arraycopy(temp, 0, dest, 0, temp.length);
return arrMap;
}
public void printArr(int[] arr,int[] arr1,int[] arr2){
Arrays.sort(arr1);
Arrays.sort(arr2);
double avgArr1 = IntStream.of(arr1).sum()/arr1.length;
double avgArr2 = IntStream.of(arr2).sum()/arr2.length;
while(avgArr1 != avgArr2){
int arrAvg = (int) (avgArr1 + avgArr2)/2;
int nearestValue = (arrAvg/2);
System.out.println(arrAvg);
Map<String,int[]> res;
if(avgArr1 < avgArr2){
res = swap(arr2,arr1,nearestValue,true);
}else{
res = swap(arr1,arr2,nearestValue,false);
}
arr1 = res.get("arr1");
arr2 = res.get("arr2");
avgArr1 = IntStream.of(arr1).sum()/arr1.length;
avgArr2 = IntStream.of(arr2).sum()/arr2.length;
Arrays.sort(arr1);
Arrays.sort(arr2);
}
//System.out.println(Arrays.toString(arr1));
//System.out.println(Arrays.toString(arr2));
}
public static void main(String args[]){
int [] intarr = {1,2,5,4};
Arrays.sort(intarr);
//ArrayAvg.printArr(intarr);
arr1 = Arrays.copyOfRange(intarr, 0, intarr.length/2);
//System.out.println(Arrays.toString(arr));
arr2 = Arrays.copyOfRange(intarr, (intarr.length/2), intarr.length);
new ArrayAvg().printArr(intarr,arr1,arr2);
//System.out.println(intarr);
}
}
【问题讨论】:
-
这不一定适用于每个数字数组...例如,不可能将
[1, 2, 5]或[1, 2, 1000, 10000]划分为均值的子集。在这种情况下,解决方案应该怎么做? -
在没有解决方案的情况下,它应该返回未找到的解决方案,尽管在上面的代码中没有处理。
-
顺便说一句,
IntStream有一个average方法,所以如果你确定数组永远不会为空,那么你可以使用double avgArr1 = IntStream.of(arr1).average().getAsDouble();否则使用可选方法来决定在空数组的情况下采取适当的行动。避免IntStream.of(arr1).sum()/arr1.length;
标签: java algorithm java-8 dynamic-programming