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分钟。

  • 相关阅读:
    pagehelper 分页不生效,总页数总是1解决方案
    SpringBoot--⼯具表达式对象
    H5中input输入框tppe为date时赋值(回显)
    img标签无法显示src中名字中带有中文的图片的问题
    SpringBoot---条件(th:if)
    SpringBoot——静态资源映射规则
    SpringBoot——HelloWorld
    《从零开始学架构》读后感
    《从零开始学架构》笔记——第四部分:架构实战
    《从零开始学架构》笔记——第三部分:可扩展架构模式
  • 原文地址:https://www.cnblogs.com/microxiami/p/5032825.html
Copyright © 2011-2022 走看看