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

华为06年面试题(要求8分钟完成)

题目:

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

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

代码:

 1 #include <stdio.h>
 2 #include <math.h>
 3 
 4 void print_array(int *arr, int n);
 5 void exchange(int *a, int *b);
 6 int sum(int *p, int n);
 7 
 8 int main()
 9 {
10     int a[] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 989 };
11     int b[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 };
12 
13     int i, j, min, suma, sumb, minus = 0;
14 
15     int n = sizeof(a)/sizeof(int);
16     suma = sum(a, n);
17     sumb = sum(b, n);
18     min = suma > sumb ? suma : sumb;
19 
20     print_array(a, n);
21     print_array(b, n);
22     putchar('
');
23 
24     for (i = 0; i < n; i++)
25     {
26         for (j = 0; j < n;j++)
27         {
28             exchange(&a[i], &b[j]);
29             minus = abs(sum(a, n) - sum(b, n));
30             if (minus < min)
31             {
32                 min = minus;
33                 continue;
34             }
35             else
36                 exchange(&a[i], &b[j]);
37         }
38     }
39     print_array(a, n);
40     printf ("sum = %d
", sum(a, n));
41     print_array(b, n);
42     printf ("sum = %d
", sum(b, n));
43     printf ("minus = %d
", min);
44 
45     getchar();
46     getchar();
47     return 0;
48 }
49 
50 void exchange(int *a, int *b)            //交换两个元素的值
51 {
52     int temp;
53     temp = *a;
54     *a = *b;
55     *b = temp;
56 }
57 
58 int sum(int *p, int n)                    //计算数组元素的总和
59 {
60     int i, sum = 0;
61     for (i = 0; i < n; i++)
62     {
63         sum += *(p + i);
64     }
65     return sum;
66 }
67 
68 void print_array(int *arr, int n)        //打印数组元素
69 {
70         int i, sum = 0;
71     for (i = 0; i < n; i++)
72     {
73         printf ("%d	", *(arr + i));
74     }
75     putchar('
');
76 }

代码简析:

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

注:

  完成时间超过8分钟,耗时约20分钟。

原文地址:https://www.cnblogs.com/microxiami/p/5032825.html