几道面试题目

1. n个数中找出最大最小需要比较多少次,找出第一大第二大最少需要多少次?

a. 找最大最少需要n-1次,这个比较好理解,考虑任意两个元素之间的比较,较小的记输一场。那么在获取最大值之后,其他元素必然至少输一场这种比较,也就是说n-1次比较时不能再少的了。简单的冒泡一遍就是n-1次。

b. 考虑如下构造竞赛数,将那n个数两辆比较(假设n=2^k),比较一次后胜出的n/2个元素中包含最大值,而其他的一半元素不含最大值,再在这n/2个元 素上进行上述操作,知道只剩下一个元素,这个元素既是最大值。这个比较过程中,除了最大元素外,其他元素只输一场即被淘汰,所以总比较次数为n-1场,也 是最少的。

   在上述构造的竞赛树中,次大值包含在那些和最大值比较的场次中,因为只有和最大值比较次大值才会被淘汰。所以需要在这些场次中寻找最大值即为次大值。由于 这棵竞赛数的高度为ceil(logn),也就是说有这么多元素和最大值进行了比较背淘汰,所以在这些元素中寻找最大值需要ceil(logn)-1次比 较。

综上寻找最大和次大的元素所需最少比较为n-1+ceil(logn)-1=n+ceil(logn)-2

此处的ceil()函数为取上整函数,主要参考了算法导论第九章的内容。

2. 证明根号2是无理数

这个网上很多证明,反证法。

suppose sqrt(2)=m/n  and (m,n)=1

then 2n^2=m^2

we can easily find that m is an even number

so m=2k

then 2n^2=4k^2, so n=2k^2

then (m,n)>=2, conflict happens

3. 递归实现Fibonacci 数列的空间复杂度,时间复杂度

画出递归树就知道结果了,这是一棵完全二叉树(我们将n-1作为左子女,n-2作为右子女),树的高度为n-1,但是实际程序递归的时候并不是并发的走这些路径,而只是一条一条的走,所以空间复杂度最大也就是树的高度O(n)

时 间复杂度的计算等价与计算F(n)=F(n-1)+F(n-2)这个数列,初值对这个数列的数量级不产生影响,这个数列的特征方程为 x^2-x-1=0 x1=(1+sqrt(5))/2, x2=(1-sqrt(5))/2. 所以数列的通项表达式为 F(n)=Ax1^n+Bx2^n.

所以数量级为 x1^n,即约等于1.618^n

3.  证明 n是素数,n+2 是素数,n+1 整除 6

反证(baoming tian提供)

假设n+1 mod 6!=0, 那么n+1 mod 6 将为1,2,3,4,5

不难验证着三种情形都不行,因为考虑前后两个都要为素数,所以结论成立。

4.  Array A[1...N] , 1<=Arry[i]<=N for any i , 1<=i<=N, judge whether there is

     duplicate number in A? You can modify A and there may be more than one
duplicate numbers

(Shengqiang Xu‘s answer).

遍历数组,设abs(a[i])=j,如果a[j]大于0,那么a[j]=-a[j],即取相反数
如果a[j]小于0,那么j就是重复的数。

5. 给定1T大小的文件,文件中每行包含一个数,这些数可能重复,内存限制2G,统计这些数中最大的不重复的10000个?
解法一:
我们使用一个节点个数限制为10000个的最小堆可以完成上述工作,并且不允许堆中有相同数字。
每次读取一个数
1.如果堆节点个数小于10000,寻找插入位置,如果数字已经存在则不插入
2.如果堆节点个数等于10000,检查是否有重复数字已经存在,如果存在继续读取数字,然后执行1,否则替换 堆顶元素并调整堆
解法二:
使用位串,假设数字是整数并且是32位长整数,那么是用一个bit表示一个数字是否存在,这样共需要的存储是0.5
每次读取一个数,将对应的bit位置一,一遍扫描结束后,我们从后往前查找着10000个置一的位置就是对应的10000个最大的数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值