免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
281 [报告]
发表于 2010-08-02 01:15 |只看该作者
哎,实在是看不下这又臭又长的讨论帖了。

首先一点,在讨论到交换数据以达到整体差值最小时
既要考虑交换单个数据,也要考虑同时交换两个,三个。。。数据
想一下 一组里有 5,7 另一组里有 1, 10,单个差值最小都是10-7=3,但是加起来5+7-1+10=11最小是1
这样一来的话
不就成了NP问题了吗

这样讨论还有意义吗

论坛徽章:
0
282 [报告]
发表于 2010-08-06 17:28 |只看该作者
看完了所有的回帖,我最后一个回帖

论坛徽章:
0
283 [报告]
发表于 2011-05-09 10:18 |只看该作者
将两个数组并在一起升序排序后,交叉取值,即第奇数个数放在一个数组中,第偶数个数放在另一个数组中,然后计算每个数组的和再相减。因为排序后相邻两个数字相差上最小的,这是我的认为:

  1. #include <stdio.h>
  2. #include <string.h>

  3. void
  4. main ()
  5. {
  6.   int arr[5] = { 1, 5, 10, 3, 8 };
  7.   int brr[5] = { 2, 4, 3, 6, 9 };
  8.   int index, jndex, temp, t, crr[10];
  9.   for (index = 0; index < 10; index++)
  10.     {
  11.       if (index < 5)
  12.         {
  13.           crr[index] = arr[index];
  14.         }
  15.       else
  16.         {
  17.           crr[index] = brr[index - 5];
  18.         }
  19.       //printf ("%d\t", crr[index]);
  20.     }
  21.   //printf ("\n");

  22.   for (index = 0; index < 10; index++)
  23.     {
  24.       for (jndex = 0; jndex < index; jndex++)
  25.         {
  26.           if (crr[index] <= crr[jndex])
  27.             {
  28.               temp = crr[index];
  29.               crr[index] = crr[jndex];
  30.               crr[jndex] = temp;
  31.             }
  32.         }
  33.     }

  34. #if 0
  35.   for (index = 0; index < 10; index++)
  36.     {
  37.       printf ("%d\t", crr[index]);
  38.     }
  39.   printf ("\n");

  40. #endif
  41.   for (index = 0; index < 10; index += 2)
  42.     {
  43.       arr[index / 2] = crr[index];
  44.       brr[index / 2] = crr[index + 1];
  45.     }

  46. #if 0
  47.   for (index = 0; index < 5; index++)
  48.     {
  49.       printf ("%d\t", arr[index]);
  50.     }
  51.   printf ("\n");
  52.   for (index = 0; index < 5; index++)
  53.     {
  54.       printf ("%d\t", brr[index]);
  55.     }
  56.   printf ("\n");

  57. #endif
  58.   t = 0;
  59.   for (index = 0; index < 5; index++)
  60.     {
  61.       t += (brr[index] - arr[index]);
  62.     }
  63.   printf ("The result is %d\n", t);
  64. }
复制代码
测试:

myz@ubuntu:~$ gcc test.c -o test
myz@ubuntu:~$ ./test
The result is 5

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
284 [报告]
发表于 2011-05-09 13:27 |只看该作者
乘方级别算法,关键还不是NP

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
285 [报告]
发表于 2011-05-09 13:27 |只看该作者
算法很简单,就是试过所有组合,找个最接近的,套进去搞定

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
286 [报告]
发表于 2011-05-09 13:33 |只看该作者
面试官说了不能用枚举
forrestgang 发表于 2006-11-13 13:59



    面试官就一白痴,典型的乘方级别算法,通用情况下无更好算法,比NPC更复杂

论坛徽章:
0
287 [报告]
发表于 2011-05-13 17:43 |只看该作者
1. 将数组放到一个临时数组中。
2. 对临时数组中的元素进行排序
3. 将数组a和b清零
4. 遍历临时数组中的每两个元素
5. 对两数组求和,将小的元素分配给和较大的数组
  1. #include<iostream.h>
  2. int get_sum(int* p);
  3. int get_min(int a,int b);
  4. int get_max(int a,int b);
  5. int main()
  6. {
  7.         int a[5]={5,4,5,9,2};
  8.     int b[5]={5,2,7,2,4};
  9.         int temp[10]={0};
  10.         for(int i=0;i<5;i++)
  11.                 temp[i]=a[i];
  12.         for(int j=0;j<5;j++)
  13.                 temp[j+5]=b[j];
  14.        
  15.         for(int n=10;n>0;n--)
  16.                 for(int m=0;m<n-1;m++)
  17.                 {
  18.                         if(temp[m]>temp[m+1])
  19.                         {
  20.                                 int tran=0;
  21.                                 tran=temp[m];
  22.                                 temp[m]=temp[m+1];
  23.                                 temp[m+1]=tran;
  24.                         }
  25.                 }
  26.                 for(int x=0;x<5;x++)
  27.                 {
  28.                         a[x]=0;
  29.                         b[x]=0;
  30.                 }
  31.                
  32.                 for(int t=0;t<10;t=t+2)
  33.                 {
  34.                         int* pa=a;
  35.                         int* pb=b;
  36.                         int sum_a=get_sum(pa);
  37.                         int sum_b=get_sum(pb);
  38.                         if(sum_a>=sum_b)
  39.                         {
  40.                                 a[t/2]=get_min(temp[t],temp[t+1]);
  41.                                 b[t/2]=get_max(temp[t],temp[t+1]);
  42.                         }
  43.                         else
  44.                         {
  45.                                 a[t/2]=get_max(temp[t],temp[t+1]);
  46.                                 b[t/2]=get_min(temp[t],temp[t+1]);
  47.                         }
  48.                        
  49.                 }
  50.                
  51.                 cout<<"a数组为:";
  52.                 for(int k=0;k<5;k++)
  53.                 {
  54.                         cout<<a[k]<<"\t";
  55.                 }
  56.                 cout<<endl;
  57.                 cout<<"b数组为:";
  58.                 for(int q=0;q<5;q++)
  59.                 {
  60.                         cout<<b[q]<<"\t";
  61.                 }
  62.                 cout<<endl;
  63.                
  64.                 return 0;
  65. }


  66. int get_sum(int* p)
  67. {
  68.         int i=1;
  69.         int sum=0;
  70.         while(i<=5)
  71.         {
  72.                 sum+=*p;
  73.                 p++;
  74.                 i++;
  75.         }
  76.         return sum;
  77. }

  78. int get_min(int a,int b)
  79. {
  80.         if(a<=b)
  81.                 return a;
  82.         else
  83.                 return b;
  84. }

  85. int get_max(int a,int b)
  86. {
  87.         if(a<=b)
  88.                 return b;
  89.         else
  90.                 return a;
  91. }
复制代码

论坛徽章:
0
288 [报告]
发表于 2011-05-14 10:46 |只看该作者
我的一点想法 先把两个数组组合在一起,然后按顺序排列,接着求出任意两个相邻的数之间的差,然后取差最小的两个数,再计算剩下的数的相邻两数的差,再取最小的,一直循环,一点见解

论坛徽章:
0
289 [报告]
发表于 2011-05-14 17:54 |只看该作者
嗯,感觉是动态规划,子问题的重叠形是肯定有的,还要分析一下最有子结构和求法

论坛徽章:
0
290 [报告]
发表于 2011-05-14 18:41 |只看该作者
呵呵,这种题目很基础的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP