LZ主攻 Java,面试官确定我不会 C 和 C++ 后放弃问了,就转向 Java 大本营。
撕代码环节
面试总共 1.5h,前 0.5h 手撕代码,然后面试官面了我 1h
代码题:实现数组的随机排序 Reorder()
题目:提供 rand() 和 floor() 函数,其中 rand() 生成 [0, 1) 的随机浮点数,floor() 返回小于浮点数 f 的最大整数
样例输入:[7, 9, 0, 3, 1]
样例输出:[3, 1, 0, 9, 7]
要求:算法尽量地高效,除了上面两个函数,不要调用其它函数
代码我就不贴出来了,本质上就是简单的“洗牌算法”,然而我在写这个面经时才知道有这种算法,在面试时我都是凭直觉写的。。罪过罪过~
正式面试环节
(1)自我介绍一下
(2)解释一下你上面写的代码(我就说了乘一个因子)
(3)有没有更快的算法啊(上面写的代码时间复杂度是 O(n) 了,我就想着怎么降低到 O(logN),然后突然提到分治?)
(4)我们今天的面试分为 Java,操作系统,计算机网络还有数据结构与算法,你做好心理准备哈(瑟瑟发抖,虽然面试官很随和)
Java 部分
(1)你知道 HashMap 的实现原理吗?你知道什么就都说出来吧
(2)HashMap 是线程安全的吗?为什么?有哪些可以保证线程安全的方法呀?(Collections.synchronizedMap(),Hashtable,ConcurrentHashMap)
(3)HashMap 扩容过程呢?(以默认容量 1 << 4 这种写法解释,展开说)
(4)你知道 Vector 和 ArrayList 吗?它们有什么区别呀?(线程安全性、初始容量大小、扩容机制、数据结构)
(5)你知道 LinkedList 和 ArrayList 的区别吗?(数据的存储结构、查询、插入的时间复杂度···)
(6)如果我有100W个数据要存储,你说用 ArrayList 好还是 LinkedList 好?(100W个数据,如果是遍历查找的话,其实性能已经体现出来了,寻址的过程会耗费时间;还有从占用空间方面考虑···)
(7)你知道有哪几种锁机制吗?(我扯远了,扯到操作系统上了,估计面试官是想问 synchronized 的锁机制,还有读写锁【共享、排它】、自旋锁、阻塞锁)
(8)我们存储一个常量是存储在哪里呀?【实际上这个问题是从操作系统问到“const”我不会,面试官转向问这个问题的;】(如果是字符串,在 JDK.1.6 还是 1.7 就被存到堆里面了,如果是其它运行时常量,则存在方法区/元空间)
(9)你知道重载是怎么实现的吗?面试官说这是个探讨性问题,没有对错哈(我懵了····)
接着引导:假设有两个函数 int a(int) 和 int a(int, int),我们要设计一个编译器识别它们,如果是你,你怎么设计呢?我就不给出我的答案了,太 low 了,面试官虽然点了点头。。
(10)来写个单例模式吧(Double Check + Lock,没错)
(11)来写个生产者-消费者模型吧(跟面试官说第一次写,后来没写好,大体上没错,细枝末节有错)
操作系统部分
(1)你知道分页内存管理吧?说一下(一块块大小相同的页,Linux 上是 4Kb,分配内存时将其分配为一块块内存大小相同的页,是一种离散式的内存管理,减少内存碎片)
(2)那分段呢?(将程序看作成一段段连续的内存分配,弊端是有大量的内存碎片,当无法分配更多内存时,需要利用 Swap 空间整理内存)
(3)那一个程序有多少个段呀?(没了解过,不好意思,菇了)
(4)你知道系统调用的过程吗?(说了从用户态陷入到内核态)
(5)追问:那是怎么陷入内核态的呀?(乱说一通,面试官说:“好了不用答了,不是我想要的哈,没事”,我就尴尬地说了不好意思)
(6)你知道操作系统的 const 吗?(不会,面试官换成 Java 部分的第8题了)
(7)了解 epoll 吗?(我了解过,但我不敢说,因为只是了解了皮毛,但是了解过 select,跟面试官解释了 select 的过程和同步非阻塞IO的主要原理)
(8)不记得了。。。
计算机网络部分
(1)TCP 是什么呀?
(2)TCP 和 UDP 的区别?
(3)王者荣耀你觉得是 UDP 还是 TCP 呀?(老问题了,都没答出来,就说了应该是 UDP,然后说了一下自己的理解,面试官无奈的说:“也许有这种可能吧···”)
(4)TCP 三次握手的过程,越详细越好
(5)不记得了。。。
数据结构与算法部分
(1)假设有 100W 个用户,它们都有一个分值,根据这个分值进行排名的,如何最快的计算出一个玩家在多少名呀?(计数排序,当时我说了很多错误答案,面试官最后看不下去了,耐心跟我说解答了,利用高考来类比,真的感激!)
(2)太紧张,又忘了。。。
反问环节
(1)你觉得我在哪些地方要加强的吗?
面试官:我觉得吧,你的 Java 水平很不错,了解了很多底层的知识,也非常扎实,就是在计算机基础这一块,深度不够噢,就是举个例子·······(一些了解底层的益处),如果你能够钻研下去,我觉得你的前途是有的(感动落泪,谢谢面试官)
(2)面试官:面试结果 3-5 天出来哈(估计凉了,被掏空)
总结
这次面试的确看到了自己和大厂的差距了,还有很多需要学习的东西都没有深度去了解,也一直都关注着应用层以上的知识点,之后可能会更加乐意去了解深层次的东西吧,反正学东西就开心地学,一丝不苟地学就对了,不忘初心,希望能帮到你们!
全部评论
(9) 回帖