1、你有没有实习经历?
2、你有没有移动端开发经验?
3、介绍一下java垃圾回收机制
这个没答出来。具体可以参考这篇博客:深入理解 Java 垃圾回收机制_BoltBear的博客-CSDN博客
4、编程语言。
4.1你常用的编程语言
java、pyhton、c++。开发小产品,做项目的时候用java,要跑深度学习和神经网络的时候用python,在leetcode、牛客上写短代码的时候用c++;
4.2为什么写短代码的时候用C++?
4.3叙述一下java、c++和python的区别
这个答得不太好,可以参考如下叙述。
Java 是一种面向对象的编程语言,是一种跨平台语言,可以在多种操作系统平台上运行,并且有着丰富的类库和工具支持。Java 代码编译后会生成字节码,这些字节码可以在任何支持 Java 虚拟机的设备上运行,使得 Java 在可移植性方面有着优势。
C++ 是一种面向过程的编程语言,是 C 语言的超集,它在保留 C 语言的优点的同时,又增加了许多新的特性,如类、函数重载、运算符重载、异常处理等。C++ 用于开发系统软件、应用软件和驱动程序,并且在计算机图形学和游戏开发领域也有广泛应用。由于 C++ 编译器直接生成机器码,所以 C++ 程序的执行速度很快,但是移植性较差。
Python 是一种解释型的、面向对象的编程语言,具有简单、优美的语法和丰富的内置库。它适用于多种应用领域,如网络编程、网站开发、数据分析、人工智能、科学计算等。Python 代码在运行时会被解释器解释执行,所以编写、调试、运行都比较方便,但是运行速度比较慢。
5、项目
5.1 你为什么要做简历上的项目,都是学校的作业或课设吗?
5.2 第三个项目只做了前端吗?
6、计算机网络
6.1叙述一下三次握手
6.2你刚才提到第一次和第二次握手要选初始序号,这个序号是随机选的吗?
这个只提到了不能随便选,但不知道如何选。这个问题可以参考:TCP建立连接的三次握手阶段为什么要协商一个随机的初始序列号(ISN),而不是默认从0开始? - 知乎
6.3第一次握手后客户端的状态是什么?
状态忘记了,应该是SYN-SENT
状态。
6.4三次握手后客户端的状态是什么?
状态的忘记了,这个应该是ESTABLISHED
状态
6.5叙述一下四次挥手
6.6你刚才提到四次挥手后要等待2个MSL,为什么呢。
我的回答:如果不等2MSL的话,若第四次挥手服务端没收到,则服务端会超时重传,而此时客服端已断开连接,不会对重传tcp报文段回复,则服务端会一直等待下去,并每隔一段时间就重传一次。所以等待2MSL时间是怕最后一个 ACK包对方没收到,那么对方在超时后将重传第三次挥手的FIN包,客户端接收到重传的FIN包后就会重传一个ACK应答包,直到在2个MSL时间内不收到第三次挥手的FIN包再断开连接。
6.7除你刚才说的这个原因外,还有没有其它原因?
面试时没回答出来,还有一个原因: 如果客户端直接断开连接,然后又向服务器发起一个新连接,但这两个连接的端口号可能是一样的,如果前一次滞留的某些数据仍然在网络中且在新连接建立后到达服务端,就会误认为这些延迟数据是属于新连接的。所以等待2个MSL可以保证本次连接的所有数据都从网络中消失。
6.8为什么第四次挥手后要等待,前面的挥手后不用等待?
6.9你知道Dos攻击吗?
面试时只说了这种攻击一直得不到合理的解决。没有去深入了解过。可以参考:百度百科-验证
7、HashMap
7.1叙述一下hashMap
7.2你刚才提到hashMap使用拉链法处理哈希冲突,那有其它哈希冲突处理方法吗?
只回答了线性探测法和二次探测法,面试时忘记了再哈希法和建立公共溢出区法。
7.3开放寻址法与拉链法的不同之处?
7.4你提到红黑树的查找效率比单链表好,那和开放定址法相比呢?
7.5HashMap只使用了拉链法处理哈希冲突吗?有没有用其它处理方法呢?
8、排序
8.1叙述一下快速排序
8.2快速排序的时间复杂度(最好,最坏和平均)
8.3你觉得自己写的快排和库封装的快排api相比哪个效率高?
8.4你知道为什么api的排序效率较高吗?
这儿回答了不知道。
8.5想想你自己写快排用的确定枢轴的方式,有没有其它更好的枢轴确定方式?
我的回答:从该划分区域随机选三个元素,取中位数作为枢轴。
到这里我就知道为什么api的排序效率较高了,api是取首元素,中间元素和末元素的中位数为枢轴,与我回答的思想是一致的。
8.6叙述一下快排和归并排序的区别
9、负载均衡
9.1你知道负载均衡吗?
我只回答了在数据量较大的情况下需使用负载均衡,没有去深入了解过,可以参考:百度百科-验证
9.2你能不能想出一个算法来实现负载均衡
提了两种想法,但都有点把问题复杂化了。
9.3你知道%运算吗?
9.4你能用%运算实现负载均衡吗?
10、在线编程
10.1求n!的尾随0
10.2你写的代码有没有问题?
10.3如何解决这个问题
这个问题解决的不好,刚开始先求阶乘再求尾随0,但存在溢出问题,然后想到了通过除以5解决,但面试时没想到具体怎么解决。求解代码如下:
int tailZero(int n){
int c=0;
while(n){
c+=n/5;
n/=5;
}
return c;
}
面试时没想到的部分:令n! = (5*K) * (5*(K-1)) * (5*(K-2)) * ... * 5 * A,其中A就是不含5因子的数相乘结果,n = 5*K + r(0<= r <= 4)。假设f(n!)是计算阶乘n!尾数0的个数,而g(n!)是计算n!中5因子的个数,那么就会有如下公式:
f(n!) = g(n!) = g(5^K * K! * A) = K + g(K!) = K + f(K!),其中K=n / 5(取整数)。