华为面试题:通过交换元素,使两个数组的元素和之差最小
2015-01-07 20:39
337 查看
题目如下:有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。网上说01背包问题,我也不懂。但是我写了个算法,应该还可以达到要求。思路如下:1. 计算数组a, b元素之和sumA, sumB,求出两者之差 sumDiff。2. 从数组a, b中找到元素a[i], b[j],使得 2 * (a[i] - b[j] ) 这个值 与 sumDiff最接近。之所以乘以2是因为a[i]与 b[j]交换之后,两者的差值相差了2倍的(a[i] - b[j])。3. 交换a[i], b[j]4. 重复步骤1 ~ 4,直到 sumDiff 不发生改变。下面是C++代码实现。
// MinMinus.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <iomanip> using namespace std; int sumArray(int a[], int ca) { int sum = 0; for (int i = 0; i < ca; i++) { sum += a[i]; } return sum; } //通过交换数组a与数组b的元素,使a中的元素之和 - b中的元素之和的差值最小 void minMinus(int a[], int ca, int b[], int cb) { bool sumDiffChanged = true; while (sumDiffChanged) { sumDiffChanged = false; int betterI = -1; int betterJ = -1; //1. 计算a与b的元素之和sumA, sumB,sumDiff为两者之差 int sumA = sumArray(a, ca); int sumB = sumArray(b, cb); int sumDiff = sumA - sumB; int betterSumDiff = sumDiff; //2. 在数组a中找到下标为i的元素,在数组b中找到下标为j的元素, //使得 2*(a[i] - b[j]) 与 sumDiff 最为接近 for (int i = 0; i < ca; i++) { for (int j = 0; j < cb; j++) { int t = 2 * (a[i] - b[j]); if (abs(t - sumDiff) < abs(betterSumDiff)) { sumDiffChanged = true; betterI = i; betterJ = j; betterSumDiff = sumDiff - t; } } } //3. 交换a[i]与b[j] if (sumDiffChanged) { swap(a[betterI], b[betterJ]); } //4. 重复步骤 1~4,直到sumDiff不发生变化。 } } void printArray(int a[], int ca) { for (int i = 0; i < ca; i++) { cout << setw(5) << a[i]; if (i % 10 == 9) { cout << endl; } } cout << endl << endl; } int _tmain(int argc, _TCHAR* argv[]) { int a[] = { 7, 9, 1, 3, 5, 88 }; int b[] = { 2, 4, 10, 12, 6, 8 }; const int sizeA = 6; const int sizeB = 6; printArray(a, sizeA); printArray(b, sizeB); cout << "before sum:" << sumArray(a, sizeA) - sumArray(b, sizeB) << endl << endl; minMinus(a, sizeA, b, sizeB); printArray(a, sizeA); printArray(b, sizeB); cout << "after sum:" << sumArray(a, sizeA) - sumArray(b, sizeB) << endl << endl; return 0; }
相关文章推荐
- 华为面试题(8分钟写出代码) 有两个数组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中的元素,使sum(a)-sum(b)最小。
- 有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 《数组-规划》 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 有两个数组a,b,大小都为n,;通过交换a,b中的元素,使sum(a)-sum(b)最小
- 华为06年面试题——求交换数组元素后差值最小方案
- 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
- 有两个数组a,b,大小都为n,;通过交换a,b中的元素,使sum(a)-sum(b)最小。
- 有两个数组a,b,大小都为n,;通过交换a,b中的元素,使sum(a)-sum(b)最小。
- 有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 有两个数组a,b,大小都为n,;通过交换a,b中的元素,使sum(a)-sum(b)最小。
- 华为面试题:交换两个数组,使得数组的和的差最小
- 每天学习一算法系列(29)(有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小)
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 交换两个长度均为n的无序数组的元素,使两数组元素的和之差的绝对值最小
- 数据结构面试题总结3——数组:求数组中两个元素的最小距离