百度的算法面试题

第一题:

某个公司举行一场羽毛球赛,有1001个人参加,现在为了评比出“最厉害的那个人”,进行淘汰赛,请问至少需要进行多少次比赛。

淘汰赛,一场淘汰一个人,自然就需要1000场,根本不需要二叉树。

用冒泡排序  排第一轮就可以了,就是1000次。


第二题

一百个灯泡排成一排,第一轮将所有灯泡打开;
第二轮每隔一个灯泡关掉一个。即排在偶数的灯泡被关掉,
第三轮每隔两个灯泡,将开着的灯泡关掉,关掉的灯泡打开。
依次类推,第n轮结束的时候,还有几盏灯泡亮着。

灯泡从 1 开始编号,所有编号为完全平方数(1,4,9,...,100)的灯泡最后会亮着。

第二题如果第n轮就是每个n的灯泡,开的关关的开

 

int count[N],m = 100,i,j,totol,sum=0;
 
    for(i=1;i<=m;i++)
    {  
  totol=0;
        for(j=1;j<=i;j++)
   if(i%j==0) totol++;
        count[i]=totol;
  printf("%d=%d ", i,count[i]);
        if(count[i]%2) sum++;
    }
 
    printf("\n%d\n",sum);

    for(i=1;i<=m;i++) {
  if(count[i]%2)
   printf("%4d",i);
 }
    printf("\n");

 


 

第三题
有20个数组,每个数组里面有500个数组,降序排列,每个数字是32位的unit,求出这10000个数字中最大的500个。

以下 n=10000,m=500,有三个方法。
   [1] sort. O(nlogn)
   [2] 将第一数组建立 min-heap,所有其他数组成员依次插入到 min-heap,每次完成插入后,删除当前最小值,即根元素。所有元素都筛过以后,min-heap 中的元素即为最大的 500 个。O(nlogm).
   [3] 将 20 个数组合并为 1 个,挨着连接起来即可,不必保证有序。在合并的数组中随机选取一个元素,然后将所有小于此元素的元素放在其左侧,大于到右侧。完成操作后,如果原来被选中的元素刚好处在右数第 500 的位置,那从它开始向右的元素即为所求。否则,如果右端元素数目大于 500,则对右端序列递归使用此方法;否则,如果左端序列数目大于 10000-500,则对左端序列递归使用此方法。复杂度 expected O(n). 
   [2] 和 [3] 都没有用到原数组有序的特性,我想应该还能改进。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值