有兩個數組a,b,大小都為n,數組元素的值任意,無序;要求:通過交換a,b中的元素,使數組a元素的和與數組b元素的和之間的差最小


public static void main(String[] args) {

method(5);
}

/**
* 有兩個數組a,b,大小都為n,數組元素的值任意,無序;要求:通過交換a,b中的元素,使數組a元素的和與數組b元素的和之間的差最小</br>
* 思路
* 1.算a b 之間的差值 differ</br>
* 2. 找出 a b 數組中差值最接近differ/2 的元素</br>
* 3. 交換元素</br>
*
* 在步驟2中,為什么是最接近differ/2 的元素,而不是differ</br>
* 因為: d' = sum(a) - a[i] + b[j] - (sum(b) - b[j] = a[i])</br>
* = sum(a) - sum(b) -2(a[i] - b[j])</br>
* = differ - 2(a[i] - b[j]) </br>
* 要想兩數組的差值最小,那么d' 就得最接近0(等於0最好了),那么differ 就與a[i]-b[j]存在2倍的關系。
*
* @param n 數組長度
*
*/
public static void method(int n) {
int[] a = new int[n];
int[] b = new int[n];
// 給數組生成數據 隨機的
for (int i = 0; i < n; i++) {
a[i] = (int) (Math.random() * 10);
b[i] = (int) (Math.random() * 10);
}

System.out.print("數組a: ");
for (int i = 0; i < n; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
System.out.print("數組b: ");
for (int i = 0; i < n; i++) {
System.out.print(b[i] + " ");
}
// 求兩個數組的差值
int differ = 0;
for (int i = 0; i < n; i++) {
differ += a[i] - b[i];
}
System.out.println();
System.out.println("\n數組a 與數組b 的差值 : " + differ);
if (differ == 0) { // 沒有差值 兩數組相等,結束!
System.out.println("數組a 和數組b 相等, 沒有差值!");
} else { // 在數組a 和b 中找出兩個數 讓他們的差最接近 difference/2
int tmp = 0; // a[i] 與 b[j] 的差值
double zjj = 1000; // differ/2 與tmp 的差值
int exchangea = -1; // 數組a的下標
int exchangeb = -1; // 數組b的下標
boolean finish = false; // 如果交換后差值等於difference/2 退出循環
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
tmp = a[i] - b[j];
if (tmp == differ / 2) {
exchangea = i;
exchangeb = j;
finish = true;
break;
} else { // 不相等 找出差值最接近differ/2 的兩個數
double aa = differ / 2 - tmp;
if (Math.abs(aa) < Math.abs(zjj)) {
zjj = aa;
exchangea = i;
exchangeb = j;
}
}
}
if (finish) {
break;
}
}

if (exchangea != -1 && exchangeb != -1) {
System.out.println("交換 a[" + exchangea + "] " + a[exchangea]
+ " 和 b[" + exchangeb + "] " + b[exchangeb]);
}
// 交換
a[exchangea] = a[exchangea] + b[exchangeb];
b[exchangeb] = a[exchangea] - b[exchangeb];
a[exchangea] = a[exchangea] - b[exchangeb];

// 交換后的差值
differ = 0;
for (int i = 0; i < n; i++) {
differ += a[i] - b[i];
}
System.out.println("交換后的差值 : " + differ);
}


結果 :



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



有兩個數組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元素的和]之間的差最小。 每天學習一算法系列(29)(有兩個序列a,b,大小都為n,序列元素的值任意整數,無序;要求:通過交換a,b 中的元素,使[序列a 元素的和]與[序列b 元素的和]之間的差最小) 有兩個數組a,b,大小都為n,;通過交換a,b中的元素,使sum(a)-sum(b)最小 有兩個數組a,b,大小都為n;通過交換a,b中的元素,使sum(a) 有兩個數組a,b,大小都為n,;通過交換a,b中的元素,使sum(a)-sum(b)最小。 java編程:兩個無序數組a和b,交換a,b中的元素,使得[序列a元素的和]與[序列b元素的和]之間的差最小。
 
粤ICP备14056181号  © 2014-2020 ITdaan.com