java编程:两个无序数组a和b,交换a,b中的元素,使得[序列a元素的和]与[序列b元素的和]之间的差最小。
2017-08-27 14:59
447 查看
题目:对于两个无序数组a和b,交换a,b中的元素,使得[序列a元素的和]与[序列b元素的和]之间的差最小。
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。例如:
int[] a = {3,5,-10};
int[] b = {20, 25, 50};
思路:
当前数组a和数组b的和之差为 A = sum(a) - sum(b) a的第i个元素和b的第j个元素交换后,
a和b的和之差为 A'
=sum(a) - a[i] + b[j] - (sum(b) - b[j] + a[i])
= sum(a) - sum(b) - 2 (a[i] -b[j])
= A - 2 (a[i] - b[j])
设x = a[i] - b[j], 则交换后差值变为 A’ = A - 2x
假设A > 0, 当x 在 (0,A)之间时,做这样的交换才能使得交换后的a和b的和之差变小,x越接近A/2效果越好,
如果找不到在(0,A)之间的x,则当前的a和b就是答案。 所以算法大概如下:
在a和b中寻找使得x在(0,A)之间并且最接近A/2的i和j,交换相应的i和j元素,重新计算A后,
重复前面的步骤直至找不到(0,A)之间的x为止。
备注:网上笔试题,代码是参考网上别人的,具体出处找不到了,请谅解。摘抄记录下来方便日后学习。如果有问题尽请批评指正,希望可以和大神一起交流。
java代码如下:
import java.util.Scanner;
public class MinSumASumB {
public static void main(String[] args) {
MinSumASumB minSumASumB=new MinSumASumB();
//输入数组a
Scanner s=new Scanner(System.in);
int an=s.nextInt();
int[] a=new int[1000];
for(int i=0;i<an;i++){
int next=s.nextInt();
a[i]=next;
}
//输入数组b
int bn=s.nextInt();
int[] b=new int[1000];
for(int i=0;i<bn;i++){
int next=s.nextInt();
b[i]=next;
}
minSumASumB.swapToMinusDiff(a, b);
//输出交换后的a,b数组
//System.out.println(Arrays.toString(a));
// System.out.println(Arrays.toString(b));
}
public void swapToMinusDiff(int[] a,int[] b){
int sumA=sum(a);
int sumB=sum(b);
if(sumA==sumB)return;
if(sumA<sumB){
int[] temp=a;
a=b;
b=temp;
}
int curDiff=1;
int oldDiff=Integer.MAX_VALUE;
int pA=-1;
int pB=-1;
boolean shift=true;
int len=a.length;//the length of a and b should be the same
while(shift&&curDiff>0){
shift=false;
curDiff=sum(a)-sum(b);
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
int temp=a[i]-b[j];
int newDiff=Math.abs(curDiff-2*temp);
if(n
9d52
ewDiff<curDiff&&newDiff<oldDiff){
shift=true;
oldDiff=newDiff;
pA=i;
pB=j;
}
}
}
if(shift){
int temp=a[pA];
a[pA]=b[pB];
b[pB]=temp;
}
}
System.out.println("the min diff is "+oldDiff);
}
public int sum(int[] a){
int sum=0;
for(int each:a){
sum+=each;
}
return sum;
}
}
运行结果:
3
3 5 -10
3
20 25 50
the min diff is 3
相关文章推荐
- 《数组-规划》 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 写正确函数需要注意的地方:两个序列a,b,大小都为n,序列元素的值为任意整数,无序;要求通过交换a,b中的元素,使序列a元素的和与序列b元素的和之间的差最小
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- [微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- [微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 华为面试题(8分钟写出代码) 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 华为面试题 题目:有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 每天学习一算法系列(29)(有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小)
- 有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
- 一个无序整数数组中找到最长连续序列(Longest Consecutive Sequence)和两个元素使得相差最小
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 华为面试题(8分钟写出代码) 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 有两个序列a,b,大小都为 n,序列元素的值任意整数,无序 通过交换a,b中的元素,使序列 a的和与序列b的和之间的差最小
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 【华为】题目:有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求: 通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
- 有两个序列a,b,大小都有n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b无素的和]之间的差最大。
- 通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小(两数组的差最小)。