华为零六年面试题——求交换数组元素后差值最小方案
华为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('\n'); 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\n", sum(a, n)); 41 print_array(b, n); 42 printf ("sum = %d\n", sum(b, n)); 43 printf ("minus = %d\n", 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\t", *(arr + i)); 74 } 75 putchar('\n'); 76 }
代码简析:
使数组中的每个元素都先交换,再对比交换前后的差值大小,差值变大的话,就取消交换,差值变小的话,就继续下一个元素的交换。
注:
完成时间超过8分钟,耗时约20分钟。