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

华为06年面试题——求交换数组元素后差值最小方案

2015-12-09 14:52 260 查看
华为06年面试题(要求8分钟完成)

题目:

  有两个数组a,b,大小都为n,数组元素的值任意,无序;
要求:

  通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。

代码:

#include <stdio.h>
#include <math.h>

void print_array(int *arr, int n);
void exchange(int *a, int *b);
int sum(int *p, int n);

int main()
{
int a[] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 989 };
int b[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 };

int i, j, min, suma, sumb, minus = 0;

int n = sizeof(a)/sizeof(int);
suma = sum(a, n);
sumb = sum(b, n);
min = suma > sumb ? suma : sumb;

print_array(a, n);
print_array(b, n);
putchar('\n');

for (i = 0; i < n; i++)
{
for (j = 0; j < n;j++)
{
exchange(&a[i], &b[j]);
minus = abs(sum(a, n) - sum(b, n));
if (minus < min)
{
min = minus;
continue;
}
else
exchange(&a[i], &b[j]);
}
}
print_array(a, n);
printf ("sum = %d\n", sum(a, n));
print_array(b, n);
printf ("sum = %d\n", sum(b, n));
printf ("minus = %d\n", min);

getchar();
getchar();
return 0;
}

void exchange(int *a, int *b)            //交换两个元素的值
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}

int sum(int *p, int n)                    //计算数组元素的总和
{
int i, sum = 0;
for (i = 0; i < n; i++)
{
sum += *(p + i);
}
return sum;
}

void print_array(int *arr, int n)        //打印数组元素
{
int i, sum = 0;
for (i = 0; i < n; i++)
{
printf ("%d\t", *(arr + i));
}
putchar('\n');
}


代码简析:

  使数组中的每个元素都先交换,再对比交换前后的差值大小,差值变大的话,就取消交换,差值变小的话,就继续下一个元素的交换。

注:

  完成时间超过8分钟,耗时约20分钟。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: