zoukankan      html  css  js  c++  java
  • 华为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分钟。

  • 相关阅读:
    Qt之镜像旋转
    Qt之QCheckBox
    Qt之动画框架
    Qt之QFileSystemWatcher
    Qt之qSetMessagePattern
    Qt之qInstallMessageHandler(重定向至文件)
    Qt之qInstallMessageHandler(输出详细日志)
    Qt之窗体透明
    Qt之窗体拖拽、自适应分辨率、自适应大小
    Qt之设置应用程序图标
  • 原文地址:https://www.cnblogs.com/microxiami/p/5032825.html
Copyright © 2011-2022 走看看