四道面试题

http://bbs.csdn.net/topics/310202905

1.有1亿个浮点数,请找出其中对大的10000个。提示:假设每个浮点数占4个字节,1亿个浮点数就要站到相当大的空间,因此不能一次将全部读入内存进行排序。 


答:
1.每100万个一组,读到内存(大约要4M内存)中,构建大顶堆,把堆顶(最大数)和文件号记录到一个100大小的数组A,再写回到磁盘,形成一个文件,这样共形成100个文件。
2。这时,A数组也添满了,再对这A数组建大顶堆。
3.堆顶A[0]输出。
4.对堆顶对应的文件(同文件号确定)去掉堆顶后重新调整堆,再把新的堆顶放到A[0].
5.对A调整堆。
6. 对2~4步循环10000次,最大的10000个数就选出来了。

2:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可。

答:
简单的说.
1. 每次读入500M个整数用快速排序排序。存为文件。
2.把产生的20个文件用归并排序两两合并,直到归为一个文件。
3.在文件中找到第5G和第5G+1个数,求这两个数的平均数即所求。


3:有一篇英文文章(也就是说每个单词之间由空格分隔),请找出“csdn”着个单词出现的次数,要求效率最高,并写出算法的时间级。 

答:
1.把整个文章存入char[]数组chars。
2.根据下标变量index扫描chars。
3.如果chars[index]==' ' && chars[index+1]!=' ';则从index+1开始判断接下来的四个字符是不是csdn.只要有一个不匹配,或者下一个字符是空格,则不再匹配。如果全匹配则counter++.
算法的时间复杂度为O(n) n为文章的长度。和“csdn”没有关系,index不会有重复的值。

4:给定一个日期2031-7-2,求出该日为星期几(已知2002-3-28为星期四)。只要求说明思路,不要写java code

答:
1.根据条件,2002-3-31为星期日.
2.从2002-4-1开始统计到2031-7-2的天数counter。
3.2002年 4,5,6,7,8,9,10,11,12月数加起来30*9+5=275天。
4.2003~2030年的天数=365*(30-3+1)+30/4
5.2031年的天数,1~6月的天数=6*30+3-2
7.20031年7月的天数为2.
8.上面3~5的天数之和放入counter.
9.counter%7为0是星期天,其它情况是几就是星期几。

我估计不让用Calender。用Calender就简单了。2002-3-28为星期四这个条件也就没有用了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值