本帖最后由 韦念欣 于 2012-6-25 00:29 编辑
这个是我写的另外一种算法,相对来说更巧妙一些,楼主可以参考一下。
1.将两数组合并为一个数组al,并排序; 2.分别获取两个数组的和; 3.取得al的最大值,放入和较小的那个数组中; 4.循环2和3,直到al没有元素,或其中有一个数组被填满; 5.若al还有数据未填写,则将数组填入没有填满的数组中。
代码:- import java.util.*;
- import java.math.*;
- public class Demo
- {
- public static void main(String[] args)
- { int[] arr1={8,9,13,43,2,33,1};
- int[] arr2={1,6,5,7,11,12,2};
- f(arr1, arr2);
- System.out.println("交换后的数组为:");
- print(arr1);
- print(arr2);
- System.out.println("两数组交换元素后的最小差值为:"+Math.abs(getSum(arr1)-getSum(arr2)));
- }
- public static void f(int[] arr1, int[] arr2)
- { LinkedList<Integer> al = new LinkedList<Integer>();
- for (int i=0; i<arr1.length; i++) // 向al中填入数据
- { al.add(arr1[i]);
- al.add(arr2[i]);
- }
- Arrays.fill(arr1, 0); // 对arr1清零
- Arrays.fill(arr2, 0); // 对arr2清零
- Collections.sort(al); // 对al排序
- int n1=arr1.length-1, n2=arr2.length-1;
- while (!al.isEmpty() && n1 >= 0 && n2 >= 0) // 填入数据
- { if (getSum(arr1) > getSum(arr2)) // 将数据填入较小的数组中
- arr2[n2--] = al.remove(al.size()-1);
- else
- arr1[n1--] = al.remove(al.size()-1);
- }
- if (!al.isEmpty()) // 处理数据未填写完的情况
- { while (n1 >= 0)
- arr1[n1--] = al.remove(al.size()-1);
- while (n2 >= 0)
- arr2[n2--] = al.remove(al.size()-1);
- }
- }
- public static int getSum(int[] arr) // 取得当前arr数组的和
- { int sum = 0;
- for (int n: arr)
- sum += n;
- return sum;
- }
- public static void print(int[] arr) // 打印arr数组的元素
- { for (int n: arr)
- System.out.print(n+" ");
- System.out.println();
- }
- }
复制代码 |