面试题过程详解


一面(约80min):
算法题1(手撕):给一颗二叉树,输出树中最长路径的长度。(注意是最长路径,而不是最大深度。)
答:先写了个O(nlogn)时间复杂度的算法,面试官表示可以优化时间复杂度,然后写了个O(n)时间复杂度的算法。写完不用测试,因为二叉树不好构造?,就讲了一下思路和代码里面变量含义。被问这个算法用的是什么遍历方式,顺便问了一波二叉树的遍历方式。

算法题2(口述):leetcode原题,给一个字符串,包含大中小括号,判断字符串中的括号是否匹配。
答:讲了一下使用栈来模拟的思路。

 

点评: 两道算法题第一题略有难度为Leetcode原题,第二题简单

然后开始自我介绍,问了一下项目。

然后开始常规问答阶段:

计算机网络:
TCP和UDP的区别?

TCP可靠,UDP不可靠

TCP面向连接,UDP不面向连接

TCP传递字节流,UDP传递数据报文

TCP是如何实现可靠传输的?

确认和重传

合理分时分片和排序

数据校验


说一下TCP断开连接的过程(四次挥手)?



为什么要有TimeWait状态?TimeWait的等待时长一般是多少?
使得前一次挥手的数据包能够到达

2MSL

面试官嘿嘿嘿,那你说一下TCP怎么计算网络延迟?
网络上有一个简单的方式:
客户端想服务器发送一个请求,同时客户端记录下当前时间:sendTime
这个请求服务器收到以后不做任何处理,直接返回给客户端。客户端收到以后再次记录当前时间:receiveTime
网络延时就是: (receiveTimer - sendTime)/ 2

操作系统:
线程和进程的区别?

进程是资源分配,线程是调度

如何创建子进程?

fork()

fork和exec有深入了解吗?
答:说了下功能,底层实现没太深入了解。


讲一下常用的换页算法?
答:提到了LRU。


你来试着实现一下LRU算法?

LRU 也是常考点



http熟悉吗?
http必问的知识点。

面试官笑笑说,那说一下http里面的方法?
答:想了半天,说有get,post,put,delete

说一下post和put的数据是放在哪个字段?
POST是用来提交数据的。提交的数据放在HTTP请求的正文里,目的在于提交数据并用于服务器端的存储,而不允许用户过多的更改相应数据(主要是相对于在url 修改要麻烦很多)。

 



说一下http返回码,403,505的含义?

先回答4代表客户端出错,5是服务器出错

403 Forbidden:请求被拒绝,服务器端没有必要给出拒绝的详细理由。

503 Service Unavilable:该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

 


数据库:
mysql熟悉吗?
答:解释了一下自己主要做的是算法,数据库用的比较少,就没有再问数据库相关的问题了。(后面的面试也没有被怼数据库,涉及到数据库相关的还给我一波解释,这一点很人性化)?

CPP:
指针和引用的区别?答略

智力题:
著名的"五个海盗分金币"问题,但是我不会。?试着分析了一波思路,其实跟正确答案相差很大。

最后,你有什么问题想问我吗?


一波作死,反问了一波TimeWait的作用,面试官也耐心的解释了一波,然后让我回去再百度一下。


二面(约60min)

算法题(手撕):一个人从起点出发,初始生命值为n,每次可以向前跳k步并消耗k点生命值,路上的每一个位置都有恢复生命值的好蘑菇,和扣除生命值的坏蘑菇,人的生命值不能为0。问该人到达终点时的最大剩余生命值是多少?如果不能到达终点,返回-1。


答:一开始以为这道题是道动态规划的题目,但是老想不出递推关系式。问了下是不是贪心的思路,面试官说是贪心,然后给了个例子以及一波暗示,我才终于发现其实每次都跳到加血的蘑菇位置就行了。然后赶紧写了波代码,就这样过去了。

 

这道题目有点难度。



介绍了简历中一个项目的一些细节。



操作系统:
如何查看Linux系统运行状态?

top命令

说一下Linux软链接以及和硬链接的区别?



Linux进程间通信的方式?
答:管道,信号量,消息队列,共享内存,套接字。

说一下命名管道和匿名管道的特点和区别?

匿名管道(pipe)
管道是IPC最基本的一种实现机制。我们都知道在Linux下“一切皆文件”,其实这里的管道就是一个文件。管道实现进程通信就是让两个进程都能访问该文件。 
管道的特征: 
①只提供单向通信,也就是说,两个进程都能访问这个文件,假设进程1往文件内写东西,那么进程2 就只能读取文件的内容。 
②只能用于具有血缘关系的进程间通信,通常用于父子进程建通信 
③管道是基于字节流来通信的 
④依赖于文件系统,它的生命周期随进程的结束结束(随进程) 
⑤其本身自带同步互斥效果

 

命名管道(FIFO)
上述管道虽然实现了进程间通信,但是它具有一定的局限性:首先,这个管道只能是具有血缘关系的进程之间通信;第二,它只能实现一个进程写另一个进程读,而如果需要两者同时进行时,就得重新打开一个管道。 
为了使任意两个进程之间能够通信,就提出了命名管道(named pipe 或 FIFO)。 
1、与管道的区别:提供了一个路径名与之关联,以FIFO文件的形式存储于文件系统中,能够实现任何两个进程之间通信。而匿名管道对于文件系统是不可见的,它仅限于在父子进程之间的通信。 
2、FIFO是一个设备文件,在文件系统中以文件名的形式存在,因此即使进程与创建FIFO的进程不存在血缘关系也依然可以通信,前提是可以访问该路径。 
3、FIFO(first input first output)总是遵循先进先出的原则,即第一个进来的数据会第一个被读走。



说一下poll,epoll和select的区别?

IO多路复用函数,select和poll基于轮询,epoll直接通知。



父进程有多个线程在运行,调用fork后,产生的子进程中有多少个线程?
答:只有一个线程

为什会只fork一个线程?会带来什么问题?
答:扯了一下unix设计fork接口那会还没有多线程的概念,所以就没考虑复制多个线程?,会带来线程安全性问题,略去100字。

可能会copy所有线程,也可能只会copy一个线程。
 


计算机网络:
说一下dns的原理?

域名解析,基于UDP

面试官看我代码是用python写的就想跟我聊一下python,可是我主要用的是CPP,python并不太熟,就只能以一波尬聊结束了面试?。


三面(约50min)

算法题(手撕):leetcode原题,买卖股票。给一组股票价格,只进行一次交易,最大利润是多少?如果可以进行多次交易,利润又是多少呢?

点评: 买卖股票问题,买卖一股和买卖多股

看我是用python写的代码,于是问python是如何实现垃圾回收的?
答:(这我没研究过哇?,慌的一匹)于是说可能是用的引用计数,没有引用的对象就会被回收。然后赶紧说了一下在CPP里面使用智能指针来管理内存的特点,算是把这个问题给水过去了。


有大量已知的url网址,以及一个新的url网址,如何高效的判断新网址是否和已知网址重复?
答:用字典树来做,省略100字。

url很长,字典树很占空间怎么办?
答:对url进行分段哈希,然后再放到树节点中,而不是直接把每一个字符作为一个树节点。

你刚才提到了哈希,那说一下哈希的实现?
答:说了下STL里面unordered_map的大概实现原理,哈希函数,二次探测,开链,省略100字。

哈希在什么情况下需要扩容?怎么扩容?
答:说了下饱和度过大时需要扩容,每次容量翻一倍。

为什么扩容时是翻一倍呢?而不是两倍,三倍?
答:(这我就真不知道了?,一顿乱猜)于是说了下STL内存分配器的特点以及里面内存池的结构可能更适合这样分配,才算糊弄过去?。

服务器中有大量数据需要迁移,如何在不停止对外服务的情况下安全的迁移数据?
答:一开始没明白意思,说这个直接复制就行噻?,

然后面试官提醒要是复制的过程中数据被改动了怎么办?
答:需要对数据加锁。

加锁了不就没法对外服务了吗?
答:可以把数据分成许多段,复制某一段的时候就把这一段数据加锁。
面试官觉得我越扯越远,就没继续问了。?

谈一下你的职业规划?答略


hr面(约20min)

一个电话打过来,hr小姐姐甜甜的声音响起……
你对岗位的了解和满意程度?意向城市?身边去字节跳动的同学多吗?去阿里腾讯的多吗?你手里现在有offer吗?如果同时拿到腾讯阿里和字节的offer,会如何选择?性格特点,举个例子?


写完以后回头看了一下,我怎么写的这么啰嗦?虽然忘记了某些问题,但是大部分问题还是如实的记录了下来。手撕代码难度中等偏下,口述问题主要涵盖操作系统,计算机网络,数据库,编程语言,大部分问题会由浅至深的抛出。

算法题是每轮技术面都有的,一面考察基础知识比较广泛,也比较基础。二面仍然考察基础知识,但是会更加有侧重点,也会更加深入。三面会问一些开放性的问题,顺带出许多知识点,所以可以向自己熟悉的方向靠。

面试官的态度都很好,不会给你太大压力。所以遇到实在不会的问题,可以直接说自己没有了解过,面试官也不会难为你。做算法题时可以先说思路,得到面试官的肯定后再开始写代码。

最后祝大家都能拿到自己满意的offer!溜了溜了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值