写在前面
阿里供应链JAVA开发,电话面1.5h。
- 整体面试问的都比较基础
- 笔者的方向是人工智能,面试官推荐投算法岗,由于笔者对JAVA不太熟悉,于是面试官说抛开语言(没有涉及到C++相关知识),重点聊的是算法
- 在这过程中,完全根据我的简历在提问,涉及到:数据结构、计算机网络、操作系统、数据库及项目,项目问的比较深入
面试流程
- 自我介绍
- 基础知识
- 项目
基础知识
数据结构内容
1. 常用的排序算法
问到了时间复杂度、空间复杂度?什么是空间复杂度?
稳定的排序算法、不稳定的排序算法(快些选一堆)?什么是稳定、什么是不稳定?
实例:10亿个数,找到其中最小的100个数,给个方案,说出其中的时间复杂度、空间复杂度
答案一:基于快排来实现,如果找到了排在位置100的元素,就找到了最小的100个数,该元素左面的元素就是最终结果;如果找到的位置在但是每次都需要比较10亿个数。
面试官对此提出疑问,问有没有其他方案;
答案二:基于堆排实现,逐渐调入内存,不需要一次性调入所有的数,时间复杂度O(nklogk)n是10亿,k是100
答案二优化:可以把所有10亿个数据分组存放,比如分别放在1000个文件中。这样处理就可以分别在每个文件的10^6个数据中找出最大的100个数,合并到一起在再找出最终的结果。
2.数据结构:对比链表和数组的优缺点
实例:链表中是否有环
答案一:遍历链表,遍历的同时进行标记,访问到一个标记过的节点说明有环,否则没有。时间复杂度O(N),空间复杂度O(N)
面试官深入询问:能否给出时间复杂度O(N),空间复杂度O(1)的算法?
答案二:双指针法,两个指针:快慢指针,快指针一次走两个节点,慢指针一次走一个节点,快慢指针相遇说明有环,不相遇说明没有环
深入提问:能否用数学思想来证明双指针法
答:用两个人在操场上跑步,来证明。快(速度):2v;慢(速度):v, 操场一圈:s. 经过时间t后 2vt - vt = ks,快指针比慢指针多跑了k圈,k = vt / s一定有解。相遇的时候慢指针跑的不够一圈,快指针跑的是k圈加上慢指针跑的路程
3.跳表
4.二叉树
什么是完全二叉树?
对二叉排序树,如何遍历得到一个升序的排序结果?
什么是深度优先遍历?什么是广度优先遍历?
5.哈希表
哈希表的功能、应用场景?就是说创建哈希结构的目的是什么?
哈希表如何实现高效查找的?
哈希算法有哪些?
直接寻址、随机数法、除留余数法、平方取中法、折叠法、数字分析法
存储数据时发生哈希冲突,有哪些处理冲突的方法?
直接地址法、再散列法、链地址法、建立公共溢出区
计算机网络内容
7.tcp/ip协议
tcp协议传输过程中会有拆包和粘包现象,什么时候会发生拆包和粘包?这种现象发生的原因?
操作系统内容
8.进程、线程和协程
用户态
协程和线程有什么关系?
多个协程对应的线程ID都是相同的
9.多路复用epoll/select
数据库
对mysql数据库了解多少?
10.数据库的事务
什么是事务?
事务的四大特征及简单解释?
mysql怎么保证事务的持久性的?
事务的隔离级别?
mysql默认情况下是哪种隔离级别?
描述下这四种隔离级别的场景?
机器学习
常用的机器学习的算法?
什么情况下会使用神经网络算法?
如何验证分类的正确性?
什么情况下会使用决策树?
实际项目中用到的是什么算法?
项目
该项目的使用场景?
两个班级的同学同时预约了这个机房,如何来处理这种情况?
数据库是怎么设计的?
两个线程是隔离的状态,如何来处理上述的冲突的情况?
加锁
锁的力度有多大?
行锁
用什么方式来实现锁?锁是加在程序里还是加在数据库里面?
加在数据库上,设置一个延时机制,定义一个全局变量,用时间来控制对当前数据库的操作
时间如何控制数据库呢?
在当前时间范围内,只有一个用户可以对数据库进行操作
两个线程可能会同时对这个变量做操作?
给变量加锁
加读锁还是加写锁?
加写锁
只有一个线程可以写成功,线程往里面写什么呢?
对数据进行递减操作
操作完后,再释放这把锁
总结
数据库、并发了解的深度不够