免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
261 [报告]
发表于 2009-06-15 22:36 |只看该作者
说说我的想法:
a[] = {11,22,33,44,100};
b[] = {55,66,77,88,0};
1.将两个数组合并到一起c[]={11,22,33,44,100,55,66,77,88,0};
2.取出任意一个数字放到数组result_a[],例如100;
3.遍历剩下的元素,将与100差值最小的数组放在result_b[],这时取出了88;
4.遍历剩下的元素,该元素放到result_a,该元素放进去的条件是时result_a与result_b的差值最小;
5.遍历剩下的元素,该元素放到result_b,该元素放进去的条件是时result_a与result_b的差值最小;
6.循环4~5

这个方法估计可以实现结果,代码应该也可以实现

论坛徽章:
0
262 [报告]
发表于 2009-06-16 14:32 |只看该作者
原帖由 la.lune 于 2006-11-13 10:55 发表
放到一个临时数组里排序后,两头取,分别存在a,b里


同意~ [/quote]


这样的数组呢?

a[1] = 1 4 2
a[2] = 6 3 9

t[] = 1 2 3 4 6 9

正确的结果应该是:
a[1] = 1 2 9
a[2] = 3 4 6

按你的算法,算不出来。

论坛徽章:
0
263 [报告]
发表于 2009-06-16 14:32 |只看该作者
原帖由 ccjjhua 于 2006-11-13 11:42 发表
把a,b 2数组的元素放到数组3(2n大小) 中进行排序,
a 先取最小的,b先取次小的,
然后根据a,b已取元素和的大小来决定谁来取剩下元素中最小的。策略是,已取得的所有元素之和大的来取C中剩下元素中的最小者。 ...


这样的数组呢?

a[1] = 1 4 2
a[2] = 6 3 9

t[] = 1 2 3 4 6 9

正确的结果应该是:
a[1] = 1 2 9
a[2] = 3 4 6

按你的算法,算不出来。

论坛徽章:
0
264 [报告]
发表于 2009-06-17 00:52 |只看该作者
1)交换前 有不等式 n<x> 大于 n<y>, <>代表平均值,假设x的平均直大于y的平均直;
2)假设交换从y拿出一个元素b, x拿出一个元素a,那么如果交换
x的平均直变为 <x>- a/n + b/n
y的平均直变为 <y>- b/n + a/n
于是两数列之间新的差为 <x>-<y> + 2/n *(b-a)
3)根据条件交换是朝着差减小的方向进行的于是有不等式
交换前的差 > 交换后的差
也就是 <x> - <y> 大于 <x>-<y> + 2/n *(b-a)
求解得到 a > b

论坛徽章:
0
265 [报告]
发表于 2009-06-17 10:05 |只看该作者

回复 #1 forrestgang 的帖子

从数组a,b随意取出一个数elment作为数组result1的元素,然后在a,b数组中找一个和element绝对值只差最小的放在数组result2中,在数组a,b中去掉这两个元素,按照上面步骤依次循环直至a,b中的元素取完了

论坛徽章:
0
266 [报告]
发表于 2009-06-17 21:50 |只看该作者
个人认为在8分钟内想出一个动态规划或者是其他方案的算法不现实,毕竟还要写出代码。

我认为一种可行的方案是使用组合,对于A、B数组中的数据存放在一个数组Data中,假设两个数组各有NUM个元素。那么我们在Data数组中选择有NUM个元素的所有情况(使用组合代数),计算选出子数组的和与未选数据的和之间的差值。记录最小差值的情况,然后显示之。

当然,这种方案显然不是最优解,但是确实有个可行的方案。(其实,我认为即使使用该方案在8分钟内实现C代码也是不现实的,除非是伪代码)

下面给出该实现:
#include <stdio.h>   
#include <stdlib.h>   

#define NUM 10

int A[NUM] = {11, 20, -3, 123, 18, 19, 171, 19, 123, 10};
int B[NUM] = {1, 23, 19, 41, 39, 123, 190, 238, 179, 25};   
  
int Data[NUM*2];      // 包含了数组A和B中的所有元素
int Data_inc[NUM];    // 保存了从Data数组中选出的NUM个元素
int Data_temp[NUM];   // 记录了当前能产生差值最小情况的NUM个元素

void Print(int *a, int n){   
        int i;   
        for(i=0;i<n;++i)   
                printf("%d ",a[i]);   
        printf("\n");   
}   
   
int get_sum(int *a, int n){
        int sum,i;

        for(sum=0,i=0;i<n;i++)
                sum += a[i];

        return(sum);
}

static int diff = 0;     // 保存了当前的最小差值
static int counter = 0;
void Handle(int sum){
        int sum0, sum1, i;

        sum0 = get_sum(Data_inc, NUM);
        sum1 = sum - sum0;
        if(counter==0 || diff > abs(sum0-sum1)){
                diff = abs(sum0-sum1);
                for(i=0;i<NUM;i++)
                        Data_temp[i] = Data_inc[i];
        }
        counter++;
}

void Com(int n, int m, int sum){   // 使用组合算法从Data数组中选出NUM个元素保存在Data_inc数组中
        int i;   
        for(i=n;i>=m;--i){
                Data_inc[m]=Data[i];   
        if(m>0)   
                Com(i-1,m-1, sum);   
        else   
                Handle(sum);   
      }   
}   
  
int   main()   
{   
        int i;

        for(i=0;i<NUM*2;i++)
                if(i<NUM)
                        Data[i] = A[i];
                else
                        Data[i] = B[i-NUM];

        printf("Sum in A: %d, Sum in B: %d\n", get_sum(A, NUM), get_sum(B, NUM));
        Print(Data, NUM*2);

        Com(NUM*2-1,NUM-1, get_sum(Data, NUM*2));

        Print(Data_temp, NUM);
        printf("Diff Value is %d. \n", diff);
      
        return   0;   
}   


[ 本帖最后由 BillStone 于 2009-6-17 21:59 编辑 ]

论坛徽章:
0
267 [报告]
发表于 2009-06-17 22:17 |只看该作者
原帖由 BillStone 于 2009-6-17 21:50 发表
个人认为在8分钟内想出一个动态规划或者是其他方案的算法不现实,毕竟还要写出代码。

我认为一种可行的方案是使用组合,对于A、B数组中的数据存放在一个数组Data中,假设两个数组各有NUM个元素。那么我们在D ...


没什么不现实的,更何况前面的xd也说了这题面试官不允许枚举做

这个问题本身可以当作动态规划的目标,不需要进行额外的推导。

利用动态规划,复杂度O(nlgn),枚举是O(n3).

[ 本帖最后由 Maxshine 于 2009-6-17 22:21 编辑 ]

论坛徽章:
0
268 [报告]
发表于 2009-06-18 15:28 |只看该作者
既然这帖子讨论了这么长时间,小弟说点算是题外话的东西。

不要认为这个题跟所谓的华为薪水不挂钩。

题本身的目的是为了找到合适的员工,华为的产品很多都有很高的技术含量,因此对于开发人员是有一定要求的,不是白菜萝卜什么都行。

薪水高低其实跟员工创造的效益挂钩,有兴趣可以看看以前网上有篇文章,讨论各公司员工的平均收益,gg,ms都是第一第二,工资高就必然了。想IBM,HP之类,别看家大业大,但是薪水也就中游水平。

论坛徽章:
0
269 [报告]
发表于 2009-06-18 15:57 |只看该作者
原帖由 Maxshine 于 2009-6-18 15:28 发表
既然这帖子讨论了这么长时间,小弟说点算是题外话的东西。

不要认为这个题跟所谓的华为薪水不挂钩。

题本身的目的是为了找到合适的员工,华为的产品很多都有很高的技术含量,因此对于开发人员是有一定要求 ...


你觉得华为的薪水很高了?

论坛徽章:
0
270 [报告]
发表于 2009-06-18 17:22 |只看该作者
原帖由 eveson 于 2009-6-18 15:57 发表


你觉得华为的薪水很高了?


呃。。。对这句话怎么说呢?

如果当成疑问句,嗯。。回答属于中下水平。

如果当成反问句。。。没必要回答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP