免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: forrestgang
打印 上一主题 下一主题

华为面试题(8分钟写出代码) [复制链接]

论坛徽章:
0
361 [报告]
发表于 2012-09-25 09:28 |只看该作者
我的想法是:先对两数组进行整体排序,然后从大到小的分配到两数组中,比如排序后为[a,b,c,d,e,f] 分配a,b数组为 [a,d,e][b,c,f];
不知是否可行?

论坛徽章:
125
处女座
日期:2014-06-14 02:20:38双子座
日期:2014-06-14 03:59:12处女座
日期:2014-06-14 04:14:31狮子座
日期:2014-06-14 05:24:38巳蛇
日期:2014-06-14 05:48:58巨蟹座
日期:2014-06-14 05:50:18摩羯座
日期:2014-06-14 06:23:58双鱼座
日期:2014-06-14 06:49:15亥猪
日期:2014-06-14 07:04:56巨蟹座
日期:2014-06-14 07:12:32双子座
日期:2014-06-14 07:26:53射手座
日期:2014-06-14 07:58:51
362 [报告]
发表于 2012-09-25 10:45 |只看该作者
                              

论坛徽章:
1
天秤座
日期:2014-03-25 15:12:56
363 [报告]
发表于 2012-09-27 14:31 |只看该作者
7楼威武,学习

论坛徽章:
0
364 [报告]
发表于 2012-10-30 23:34 |只看该作者
本帖最后由 lvzhiqiang1990 于 2012-10-30 23:37 编辑

1.计算当前两坨数据a-b=m(假设a>b)
2.计算两坨数据中差值最小的两个数a(i)、b(j),假设其差为m1    (a(i)>b(j))
3.如果2*m1>m,则此时达到差值最小
4.若3不成立,交换a(i)、b(j),更新m=m-2*m1,更新m1,此时只用计算调换过来的数据与原来数据的差值最小值
重复3、4即可

基本思想是如果二者差已经最小了,则较大的一堆里面与较小的一堆里面的数的差值的2倍必然超过总和的差,否则的话就可以通过调整二者从而减小总和的差。
yyguzhou 该用户已被删除
365 [报告]
发表于 2012-10-31 13:20 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
366 [报告]
发表于 2012-11-01 00:03 |只看该作者
我的思路是:
a0、a1、b0和b1先进行比较交换,然后a0和a1之和、b0和b1之和、a2和b2进行比较交换,以此类推。
全部元素比较完之后,再从最后元素用相同方法倒过来比较交换一次。

下面是我编写的代码:
  1. #include <stdio.h>

  2. void swap(unsigned int *pa1, unsigned int *pa2, unsigned int *pb1, unsigned int *pb2)
  3. {
  4.         unsigned int sort[4];
  5.         unsigned int tmp;
  6.         int i,j;
  7.         sort[0] = *pa1;
  8.         sort[1] = *pa2;
  9.         sort[2] = *pb1;
  10.         sort[3] = *pb2;
  11.        
  12.         for (i = 4; i > 0; i--)
  13.         {
  14.                 for (j = 0; j < i-1; j++)
  15.                 {
  16.                         if (sort[j] > sort[j + 1])
  17.                         {
  18.                                 tmp = sort[j];
  19.                                 sort[j] = sort[j + 1];
  20.                                 sort[j + 1] = tmp;
  21.                         }
  22.                 }
  23.         }
  24.        
  25.         *pa1 = sort[0];
  26.         *pa2 = sort[3];
  27.         *pb1 = sort[1];
  28.         *pb2 = sort[2];
  29.        
  30.         return;
  31. }

  32. void my_printf(int *p, int num)
  33. {
  34.         int i;
  35.         for (i = 0; i<num; i++)
  36.         {
  37.                 printf("%d  ", p[i]);
  38.         }
  39.         printf("\n");
  40.         return;
  41. }

  42. int main()
  43. {
  44.         unsigned int a[10];
  45.         unsigned int b[10];
  46.         unsigned int sum_a = 0;
  47.         unsigned int sum_b = 0;
  48.         unsigned int tmp;
  49.         int i;
  50.        
  51.         printf("###########aaaaaaa##########\n");
  52.         my_printf(a, 10);
  53.         printf("###########bbbbbbb##########\n");
  54.         my_printf(b, 10);
  55.         swap(&a[0], &a[1], &b[0], &b[1]);
  56.         sum_a = a[0] + a[1];
  57.         sum_b = b[0] + b[1];
  58.        
  59.         for (i = 2; i < 10; i++)
  60.         {
  61.                 if (sum_a > sum_b)
  62.                 {
  63.                         if (a[i] > b[i])
  64.                         {
  65.                                 tmp = a[i];
  66.                                 a[i] = b[i];
  67.                                 b[i] = tmp;
  68.                         }
  69.                        
  70.                 }
  71.                 else
  72.                 {
  73.                         if (a[i] < b[i])
  74.                         {
  75.                                 tmp = a[i];
  76.                                 a[i] = b[i];
  77.                                 b[i] = tmp;
  78.                         }
  79.                 }
  80.                 sum_a += a[i];
  81.                 sum_b += b[i];
  82.         }
  83.        
  84.         printf("###########aaaaaaa##########\n");
  85.         my_printf(a, 10);
  86.         printf("###########bbbbbbb##########\n");
  87.         my_printf(b, 10);
  88.        
  89.         swap(&a[9], &a[8], &b[9], &b[8]);
  90.         sum_a = a[8] + a[9];
  91.         sum_b = b[8] + b[9];
  92.         for (i = 7; i >= 0; i--)
  93.         {
  94.                 if (sum_a > sum_b)
  95.                 {
  96.                         if (a[i] > b[i])
  97.                         {
  98.                                 tmp = a[i];
  99.                                 a[i] = b[i];
  100.                                 b[i] = tmp;
  101.                         }
  102.                        
  103.                 }
  104.                 else
  105.                 {
  106.                         if (a[i] < b[i])
  107.                         {
  108.                                 tmp = a[i];
  109.                                 a[i] = b[i];
  110.                                 b[i] = tmp;
  111.                         }
  112.                 }
  113.                 sum_a += a[i];
  114.                 sum_b += b[i];
  115.         }
  116.         printf("###########aaaaaaa##########\n");
  117.         my_printf(a, 10);
  118.         printf("###########bbbbbbb##########\n");
  119.         my_printf(b, 10);
  120.        
  121.         return 0;
  122. }
复制代码

论坛徽章:
0
367 [报告]
发表于 2012-11-01 13:21 |只看该作者

本帖最后由 rag 于 2012-11-01 13:22 编辑

c代码好多年不写了,写不出来了。

我的思路是这样的

分别求出数组a、b的和,以及a、b和的差,差值取绝对值,以下皆同;
遍历数组单元的次数;
遍历数组,找出,a、b各自的最大值,最小值;
数组a的和大于b的和,分析计算a的最大值与b的最小值的差,否则计算b的最大值与a的最小值差。比较,如果大,找下一个次最大值,计算比较,小,且交换后的和差绝对值小于但前差,交换,修正a、b各自的和,否则,结束。将当前置换值替换值a、b各自的最大值、最小值,重复此步骤,直到满足条件:a的最大值=最小值或者b的最大值=最小值,或者遍历数组的次数完毕。

论坛徽章:
0
368 [报告]
发表于 2012-11-01 15:19 |只看该作者
本帖最后由 nick97 于 2012-11-02 13:01 编辑

这题有那么复杂么  
元素个数n 求出组合序列然后再依次求和 - 总和/2 再求绝对值 取最小的一对

1234
5678
总和为36 除以2 18

1234     |1+2+3+4 - 18| = 8
1235     |1+2+3+5 - 18| = 7
。。。
只是要手写的话太麻烦。。 要累死人了

论坛徽章:
0
369 [报告]
发表于 2012-11-06 11:43 |只看该作者
     1 #include <stdio.h>
      2 #include <stdlib.h>
      3
      4 void swap(int *a, int *b) {
      5     int tmp = *a;
      6     *a = *b;
      7     *b = tmp;
      8 }
      9
     10 int sum(int arr[], int len) {
     11     int tmpSum = 0;
     12     int i = 0;
     13     for (; i < len; i++) {
     14         tmpSum += arr[i];
     15     }
     16     return tmpSum;
     17 }
     18
     19 int comp(const void *p, const void *q) {
     20     return (*(int*)p - *(int*)q);
     21 }
     22
     23 int main(int argc, char *argv[]) {
     24     int arr[] = {10, 45, 69, 78, 36};
     25     int brr[] = {25, 85, 71, 63, 42};
     26
     27     int asum = 0;
     28     int bsum = 0;
     29     int tmpSum = 0;
     30     int len = 5;
     31     int i = 0;
     32
     33     qsort(arr, len, sizeof(int), comp);
     34     qsort(brr, len, sizeof(int), comp);
     35
     36     asum = sum(arr, len);
     37     bsum = sum(brr, len);
     38     tmpSum = abs(asum - bsum);
     39     printf("asum = %d, bsum = %d, tmpSum = %d\n", asum, bsum, tmpSum);
     40     
     41     for (i = len -1; i >= 0; i--) {
     42         swap(&arr[i], &brr[i]);
     43         asum = sum(arr, len);
     44         bsum = sum(brr, len);
     45         
     46         if (tmpSum > abs(asum - bsum)) {
     47             tmpSum = abs(asum - bsum);
     48         } else {
     49             swap(&arr[i], &brr[i]);
     50         }
     51         printf("asum = %d, bsum = %d, tmpSum = %d\n", asum, bsum, tmpSum);
     52     }
     53     
     54     return 0;
     56 }

论坛徽章:
0
370 [报告]
发表于 2012-11-18 19:24 |只看该作者
哦知道了,最短路径问题,或者背包问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP