已通过
上来先聊了一会儿,问了读研几,啥时候毕业之类的。还问了实习安排,能实习多久之类的。
简单自我介绍
稍微讲了一下项目
- 接着项目问的什么是抽象语法树?
- 抽象语法树的作用,为什么要用抽象语法树?
提问(问的问题都好难)
- 语法tang了解过吗?(我连哪个tang都不知道。。)
- java编译后的产物,字节码之类的知道多少。(不知道。。表示对java不是很了解)
- c++里的多态,虚函数怎么实现的(看我不懂java,想了一会儿问的c++的问题,感觉这是全场唯一一个能正常回答出来的问题)
- 动态代理?(不知道。。)
- systemcall了解吗,为什么会有系统调用?(答了一些内核态和用户态相关的东西)
- 具体的系统调用有哪些,具体是怎么执行的?(盲猜了一个c++里面的sleep函数,具体咋执行的乱答了继承阻塞之类的。。)
- 文件描述符(不是很了解,乱答了一些文件的唯一标识,记录文件状态之类的)
- 一个文件可以有两个文件标识符吗?(不知道)
- CDN了解吗?(不了解)
- 解释了一通CDN,问CDN存在的意义或者作用是啥?(一开始理解成用户可以把数据保存在CDN上可以把连接共享给别人,结果理解错了,面试官又解释了一下一般是服务商把资源放在CDN上供用户访问,问这样做有什么作用。想了一会儿答了本来要访问服务器的请求转到CDN上了,可以用来缓解服务器压力之类和分流之类的,然后感觉和云边端服务器有点像有聊了一大堆云边端的东西,比如提高访问性能啊之类的)
- 如果CDN上的一个资源不见了,用户访问会怎么办?(不知道。。乱聊了一些设计一个表记录资源是否存在,没有资源了就告诉用户无法访问)
- 还是上一个问题,有没有别的办法?(不知道。。又乱聊了一些CDN如果发现资源不存在就向服务器请求重新发送资源,好像聊对了,面试官说这叫CDN回源)
- 然后就问了回源还有啥别的作用?(不知道。。)
- 除了http还了解过其他不常见的协议吗?(不知道,表示只了解过ftp,ssh之类常见的协议)
- QUIC协议了解过吗?(惊了,才看的,答了一下是谷歌做的UDP的升级版,http3.0之后使用的协议,利用udp不需要建立连接解决了tcp握手比较慢的问题,在udp基础上增加重传和拥塞控制等功能保证了可靠性。因为了解的不深说的都很肤浅,面试官反应还行。)
- 对kotlin有了解吗?(没接触过。。)
- 对安卓开发有了解吗,做过项目吗?(有一点了解,大学做过几个app)
- 讲一下做的安卓项目。(讲了个模拟请假的app,听到我说后来全校都在用面试官笑了。)
算法题
给一个正整数组nums和一个数字N,每次都从数组头部或者尾部取出一个数字从N中减掉,问最少需要多少使N变为0,如果不能变为0则输出-1。
想了一会儿先给了个暴力解。
最后的结果一定是从数组前面取出一段加上从数组后面取出一段,这两段的和是N。所以最简单的做法是先计算前缀和以及后缀和,然后n^2暴力,对于每一个前缀和找有没有一个合适的后缀和使二者的和为N,如果有则用二者的长度更新ans。
面试官表示这个方案应该可以解决,但是能不能优化?
想了个优化方案复杂度优化到了O(nlogn)。之前的方案复杂度主要在对于每一个前缀和都要枚举遍历每一个后缀和,而因为都是正整数,所以后缀和是具有单调性的,所以可以用二分的方式找有没有这个前缀和匹配的后缀和。
面试官表示可以,但感觉我的解法跟他想的不一样,又说了一下这个题相当于有两个指针啥的,一个指向前一段,一个指向后一段
面试官说道这里突然悟道他的的意思了。。这题可以反过来想,假设整个数组的和为M,这题其实就相当于从数组里找一段使其和为M-N,然后就没了。。
面试官说那写出来吧。然后看面试官的表情确定这就是他想要的方法。
我就写了个最复杂的方法。枚举子数组的头尾,然后对数组求和看是否等于M-N,连前缀和都没写,复杂度O(n^3)。。
问哪里可以优化?
第三层for循环可以用前缀和替换,优化到O(n^2)。然后就结束了。。
但是这个方法明明没有我刚刚说的那个二分的复杂度低呀。。。
顺便问一下英语怎么样啊?敢说吗?(我笑了,表示还行吧,无障碍交流做不到,听懂应该差不多。。感觉要gg)