您的位置:首页 > 职场人生

华为面试题:通过交换元素,使两个数组的元素和之差最小

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;
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐