HashMap 1.8之前是头插,1.8之后是尾插
面头条之前我刷了头条所有的LeetCode,并且几乎所有题都能自己AC,自认为头条面试题不会太难。
正题:
手写单例模式?单例模式是啥不会,这个确实不会
懒汉式和饿汉式,懒汉式要求线程完全,双重校验
hashmap问的非常底层,没答好
数组加链表,hashcode 和位置计算
无序数组取中位数,没答好
数组长度为奇数
思路2)
2.1)将前(n+1)/2个元素调整为一个小顶堆,
2.2)对后续的每一个元素,和堆顶比较,如果小于等于堆顶,丢弃之,取下一个元素。 如果大于堆顶,用该元素取代堆顶,调整堆,取下一元素。重复2.2步
2.3) 当遍历完所有元素之后,堆顶即是中位数。
快排思路
快速排序之所以得名"快排",绝非浪得虚名!因为快排就是一种分治排序法!
同样,找中位数也可以用快排分治的思想。具体如下:
任意挑一个元素,以改元素为支点,划分集合为两部分,如果左侧集合长度恰为 (n-1)/2,那么支点恰为中位数。如果左侧长度<(n-1)/2, 那么中位点在右侧,反之,中位数在左侧。 进入相应的一侧继续寻找中位点。
这种方法很快,但是在最坏的情况下时间复杂度为O(N^2), 不过平均时间复杂度好像是O(N)。
以上3个基本没答上好或者没答上来之后,面试官也没啥兴趣了,我心态有点崩,这是我20+次面试唯一的一次这样的崩
我最不能忍得是最后一个2个array merge成一个array没过?????这大一就能随便乱写的题,居然没过,菜不找借口
然后草草结束了面试
1,TCP的三次握手,为什么是三次握手,不是二次,四次
2,ArrayList 和 LinkedList之间的区别,在并发的情况下,增删改查有什么问题出现
3,反转链表代码
4,数据库的explain,然后还有一些不太懂的
5,GC的几种垃圾收集算法,彼此之间有什么异同
6,sping的ioc,aop这些
........
最后问了一个博弈论,不太懂,就是那种谁先走,谁后走,每次走多少步那种,要想A赢该怎么走
面试官其实问了很多,他拿了一张纸,把每个问题都写下来了,回答的不是很满意的就画个框,写了满满一页。一面总体来说还是比较简单,偏基础。
二面,二面的面试官其实人还是不错的,但是菜是原罪,操作系统这块我不好,然后刚好都是问了***作系统的知识,所以气氛有点尴尬,但是面试官真的不错,他说了一句,放心,你有下一面的。我还给自己挖坑过,说可以聊聊数据库,又很尴尬。后面,自救了一波,聊JAVA内容,到这边回答的应该还可以了。主要还是并发那一块的知识,再加上JAVA锁优化,说了一下偏向锁,自旋锁这些内容,就12.30了,面试官就带我吃饭去了。有赞楼下的吃饭地方还是蛮好的,放的竟然都是霉霉的歌曲,心情瞬间好很多了。
三面,HR面,比如你有几个offer,碰到的最大挫折,最大收获这种。
四面,我以为三面完了就可以走了,没想到还有四面,四面说是业务面,也不懂是什么意思。主要还是问了项目,把项目介绍了一下,然后自己在嘉兴做的一些偏硬件相关的内容。最后问了一下有什么要问他的,早上他有讲PPT,里面有个问题不懂,我就问了一下他,其实答案我也没有人在听了,因为能感觉到大家都很累了,嘴巴都说干了感觉。哦对了,我的项目就是牛客网的中级课程,谢谢叶神。
作者:胡萝卜君嘿嘿
链接:https://www.nowcoder.com/discuss/334682?type=2&order=0&pos=30&page=1
来源:牛客网
整体感觉比较难。技术挖掘的很深入。
- 正则表达式,考察十分基础的内容
- HTTPS原理,这一点很多公司都考过。属于重点基础知识
-
代码输出结果是什么?从JVM的角度,进行解释。1
2
3
4
5
6
7
8
9
10
11
12
13
14
public
class
Test {
private
String name =
"小明"
;
public
static
void
main(String[] args) {
Test test =
new
Test();
test.print();
}
public
void
print(){
String name =
"小红"
;
System.out.println(name);
}
}
仅供参考的答案(不一定完全正确):输出【小红】。变量优先从局部变量中寻找,所以打印方法中的name变量。 -
聊一聊Java的多态。
本人建议分为编译期多态和运行期多态阐述,并且从JVM角度,深入解释原理。
- HashMap的数据结构
考察HashMap几乎是每个公司都会涉及到的。回答时建议多说一点,把知道的内容全部讲出来,主动表现自己的知识面。我给出我自己的思路,仅供参考:
1.HashMap是一种非线程安全的集合类。利用空间换时间的思想+哈希来实现。
2.本质是数组+链表的结构。强烈建议在纸上面画出来。
3.put的大致过程。涉及到resize操作
4.新版JDK中,链表长度到8,转为红黑树
5.线程不安全情况举例。多线程,同时扩容,形成循环链表,导致死循环。
6.这里说一个非常细节的问题,HashMap内部是如何判断一个链表上两个元素是否相等?
如果这里直接说是通过equals来判断,那么就可能上当了。这里附上JDK源码:
源码不是单纯的使用equals作为判断依据。因为equals的实现往往稍微复杂耗时一点(相对于用 == 比较hashcode和key而言),所以源码的实现可以提高比较效率。1
2
if
(p.hash == hash &&
((k = p.key) == key || (key !=
null
&& key.equals(k))))
优先比较hash值,因为两个对象的hashcode相等,则equals必须返回true。
其次再用==比较对象的地址,是否相等。
最后才使用equals进行判断。
本人理解了这里的源码为什么这么写之后,更深刻的理解到,JDK的源码是多么的注重细节和实现效率,考虑的真的非常细致。赞~
HashMap可以讲很久,面试中根据面试官的反应,点到为止。讲出自己的知识深度即可。
编程题:
修改HashMap中的put函数,要求保留原有的特性,并且使得底层的每个链表是有序的(value升序)。
滴滴(3轮技术)
滴滴的面试挺有趣的,很多情景题。
- 操作系统。解释一下 用户态,内核态。一次文件读取中,哪些操作对应了什么状态。
- 一个手机内存很小,需要设计一份电话黑名单功能。用什么数据结构,和思路。
答案是:两次HashMap。参考布隆过滤器的实现思路。方案优点在于,占用空间很小,效率比较高。 - 两个文件,找到其中的交集。谈一谈自己的策略。【抱歉,这一题,我不会。】
- 设计一个流水号生成器。谈谈思路。
参考FaceBook的雪花算法。 - 算法题:动态规划。二维迷宫,每次可以向右或者向下走一步。问:左上角走到右下角一共几种走法。
比较简单的动态规划。思路就是,每个格子的方法数=上面相邻格子方案数+左边相邻格子方案数。注意边界情况和初始化,即可。
腾讯(3轮技术+HR)
腾讯也很有自己的特点。问了许多智力题,很看重个人的逻辑能力。
- 了解哪些开源框架,会从你的回答中,进一步考察一下框架的原理。
- 学习遇到的问题,问的比较深入。
- socket的select模型和epoll模型。
- 智力题1:1到1000中,多少个数字包含8。例如:118,888,583其中某一位包含了8.
- 智力题2:64匹马,8个赛道。最少经过多少次比赛,可以得出前4匹最快的马。
秋招准备和面试建议
算法题推荐《剑指offer》。
- 大家一定要用手在IDE上敲一下,不要觉得自己弄懂了思路,看懂了源码,就不写了。一定要亲手独立敲一遍。最好先用自己的思路敲一遍,再看答案。如果你没有思路,你就设想,这是正在面试,你该如何用另外的方法写出来。即使是暴力法,也要比写不出来要好。亲自敲一遍,才能知道自己敲代码的速度还是很慢,才知道自己调用函数时忘记函数名有多尴尬,才知道自己忘记在最开始写参数校验了。。。。。。务必要,亲自敲一下。
- 关于知识点,网上有很多知识点总结,大家自行找吧,主要是要总结,自己整理一份文档,让自己复习看的方便。
- 多和身边的同学交流,一方面消息流通,不要错过了公司的投递。一方面,多交流知识的理解,互相提升
- 和面试官交流,最好画出自己的思路。用画图的方式表述思路,更清晰。优秀的交流能力,是面试评价的一项;
- 对于代码题,不要着急写。先想思路,然后交流。注意,一定要主动交流自己的思路,最好还能分析思路好在哪里,复杂度是多少。面试官同意后,再开始写代码。给面试官留下好印象,有几次,我说出了自己的思路后,面试官直接就表示可以不用写了,可能是觉得我太厉害了,相信我没问题了吧。哈哈哈哈,请允许我自恋一下。
最后,请大家放平心态。面试中,自己最多能控制80%。还有其他的不可抗力因素,比如:HC已经没了,面试官心情不好,过于苛刻的面试官....比如我调整过一次面试时间,然后就没有后续了。。。。没有了。。。。没了。。。。卒
再啰嗦一下哈,大家不要放弃任何一个机会。不要觉得自己水平有限,肯定通过不了某某公司的面试的。最后直接放弃了面试,或者就不去投递简历。我自己秋招也从来没有想过最后能拿到现在的offer。不去试一试,你怎么会知道结果呢。勇敢一点,又不会死。梦想还是要有,万一成了呢?
现在是2019年11月4日,晚上八点。祝已经拿到offer的同学,顺利签约;祝还在一线奋斗的小伙伴,OC快来。
希望这份经验,可以帮到大家一点点吧。
还愿结束,拜拜啦~