免费注册 查看新帖 |

Chinaunix

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

面试归来,问几道牛逼UNIX C/C++笔试题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2009-12-24 19:31 |只看该作者
其实我奇怪,我可以算出2000!,为什么还要去数它后面还有几个0?

论坛徽章:
0
22 [报告]
发表于 2009-12-24 19:32 |只看该作者
原帖由 cjaizss 于 2009-12-24 19:27 发表
第一题,建一个堆,也就是优先级队列
最后一题:2000+[2000/5]+[2000/5^2]+[2000/5^3]+[2000/5^4]=2419



这个公式明显不对嘛。如果把 2000 换成 3,那 3! 就至少含有 3 个圈了。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
23 [报告]
发表于 2009-12-24 19:37 |只看该作者
原帖由 retuor 于 2009-12-24 19:32 发表



这个公式明显不对嘛。如果把 2000 换成 3,那 3! 就至少含有 3 个圈了。

不好意思,算错了。
把开始那个2000去掉

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
24 [报告]
发表于 2009-12-24 19:43 |只看该作者
第4题外排序由点意思

论坛徽章:
0
25 [报告]
发表于 2009-12-24 21:26 |只看该作者
第7题,算法比赛常考的题目
第1题,看算法导论堆排序那张,用大顶堆

论坛徽章:
0
26 [报告]
发表于 2009-12-24 21:44 |只看该作者

回复 #1 unistd 的帖子

第一道题应该用分组的方法,将N数分成m组,每组的元素数目应该远大于n,各组取其前n个,依次循环即可解决。

论坛徽章:
0
27 [报告]
发表于 2009-12-24 21:56 |只看该作者
原帖由 cjaizss 于 2009-12-24 19:27 发表
第一题,建一个堆,也就是优先级队列
最后一题:[2000/5]+[2000/5^2]+[2000/5^3]+[2000/5^4]=499



讲讲原理。。。。。。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
28 [报告]
发表于 2009-12-24 22:11 |只看该作者
原帖由 cugb_cat 于 2009-12-24 21:26 发表
第7题,算法比赛常考的题目
第1题,看算法导论堆排序那张,用大顶堆


要找最大的前n个吧,应该用小顶堆(最小堆)。

1.首先将前n个数做成小顶堆,O(n)。
2.后面每一个数和小顶堆的首元素比较,若大于,则置换,并保持堆的状态,O(mlogm) (m是剩余的数字个数)。
3.不要求顺序,就到此结束,否则对前n个数进行堆排,O(nlogn)。

感觉这个方法n越接近数据总数的一半效率越高。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
29 [报告]
发表于 2009-12-24 22:13 |只看该作者
1、从N个数中选出n个最大的数,写出思路和实现。
先读入n个,并且排序,队列,就是有序的队列。然后再一个个读,比最大的那个大的时候就FIFO。

------------------------------------------------------------------------------

维持有序队列,效率明显不如堆高。

论坛徽章:
0
30 [报告]
发表于 2009-12-24 22:19 |只看该作者
1.这个可以用改进过的quicksort或者用最大堆解决
4.可以使用bitmap sort
/* phase 1: initialize set to empty */
for i = [0, n)
bit = 0
/* phase 2: insert present elements into the set */
for each i in the input file
bit = 1
/* phase 3: write sorted output */
for i = [0, n)
if bit == 1
write i on the output file

整数最大值不超过8亿,建立这个bitmap需要8亿/8/1000/1000=100M的空间,考虑到最多重复两次,所以需要200M内存
因而可以考虑处理两次,第一次处理0-4亿的数据,将结果存放在硬盘上。第二次处理5-8亿范围内的数据,将结果存放于硬盘上
详见编程珠玑第一章
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP