【面经笔记】

如果真的被问到不会的,就直接说你不会(说你不会、说你不会,我再补充两遍),礼貌地说这方面可能我还要多学习。(对一个拿不准的问题千万不要猜,即使是二选一的那种问题,猜错了直接完蛋,猜对了被人看出来,再往深问还是完蛋)

另外,像可能,大概是,我觉得这种表达最好不要,一听就是对一个点没把握,会让面试官觉得学习太浮躁不喜欢寻求原理。


印象最深的项目,最大的难点是什么?


O(1)删除执行链表结点,做分析(其实是要指出剑指offer中那个直接copy值的方法的缺陷和隐患)

两个特殊情况需要进行考虑:

  (1)如果要删除的结点位于链表的尾部,那么它就没有下一个结点:

  此时我们仍然从链表的头结点开始,顺序遍历得到该结点的前序结点,并完成删除操作,这仍然属于O(n)时间的操作。

  (2)如果链表中只有一个结点,而我们又要删除链表的头结点(也是尾结点):

  此时我们在删除结点之后,还需要把链表的头结点设置为NULL。
  


假定有20个有序数组,每个数组有500个数字,降序排列,现在需要取出这10000个数字中最大的500个,怎么做?

  1. 建立优先队列(qriority_queue)/大顶堆(heap),维度为数组的个数,这里为20(第一次 插入的是每个数组中最大的值,即第一个元素)。

  2. 删除最大堆堆顶,保存到数组或者栈中,然后向最大堆插入删除的元素所在数组的下一个元素。

  3. 重复第1,2个步骤,直到删除个数为最大的K个数,这里为500.

注:如果数组不是有序的,可以先对每个数组建立大顶堆。

注:建堆的时间复杂度是多少? O(n)。


单例模式的特点,几种实现,容易引发的问题

http://blog.csdn.net/xiaxzhou/article/details/72961654


旋转数组中查找某一个值

在一个排序的数组中,如{1,2,3,4,5,6,7},经过旋转后得到{4,5,6,7,1,2,3},当然也可以得到原数组{1,2,3,4,5,6,7},在该旋转后的数组中查找某个元素。

陷阱在于数组不是严格递增

http://blog.csdn.net/xiaxzhou/article/details/77433428


100亿个数找最大1000个

· 问你确定吗?(顺序读取,用最小堆

· 有什么缺点,分布不均匀(说一下堆的复杂度由来)

· 有没有其他思路(用hash散列,计数排序)

· 这个更慢,还有更快的吗(我心想我平时就都是答得堆啊,怎么这次还有更快的?)

· 然后讲了基于partition的划分思想(找到第k个开始partition,在左边就在右面递归,在右面就在左边递归,最后确定partition出最大的k个)

· 这种思想了解了,但最坏情况太差,不稳定,还有更快的吗

· 不够精确,还有又精确又稳定的吗?

· 并行、多线程、分布式

· 那又给你一个数,你怎么快速告诉我是不是在这100亿个数中?

· 这个我知道有可能是想问Bloom Filter,但是具体到hash函数去几个怎么算,怎么判断误差等细节,我也记不太清了,就说了说思想。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值