【面经】美团-前端&移动端暑期实习

0322 upd

因为保密等原因,不能把算法题原题露出来了,只能把本文进行修改..
现在底部的算法题已经变成考点了


不知道为什么,按照群里的要求说,25届毕业的都需要投【转正实习】,而不是【日常实习】

机试

机试在牛客,整体上按照基础+算法的层次划分。

计算机基础关于操作系统,读取硬盘和扇区的部分不太记得了。总之基础不太牢固,预估选择题总共30个错了5-10个

当时想法就是随便做做,也没提前准备太多,所以也没太记住都考什么了

关于机试算法,或许是按照前面的答题情况来分配的?我不知道总之两道题都很水,微信公众号也能看到机试的全部算法题目。

面试

面试才是促使我写这篇Blog的核心,刚刚完事,心里百味杂陈就写了。

【组成】:个人介绍+计算机基础(偏向计网)+语言核心(选择java)+方向核心(选择安卓)+算法题

计算机基础

  1. 计算机网络相关,你都知道那些http状态码呢?

答了200,301,302,500,404这些。

  1. 刚刚你提到300系列开头的都是关于重定向的,能详细给我讲讲吗?比如301和302的区别?

当时就没太答上,大概我说的是‘301是Moved Permanently,是永久移动,302是临时重定向’
【参考答案】:301是永久重定向,表示所需求的资源已经永久的转移到了新位置,这包含了域名的改变和资源路径的改变。
302是临时重定向,表示所请求的资源在24到48小时内临时的转移。

  1. 那临时重定向和永久重定向有什么区别?能详细说说么

完全没答上,说了个URL会改变,其实完全不对,他们的区别是URI的关系,但彼时的我根本不知道什么是URI
【参考答案】:为什么要重定向呢?因为网站的URL经常会被用户收藏在自己的收藏夹,或者通过许多渠道进行传播,而如果用户再次通过URL访问这些资源时,如果不重定向那么就会404。而如果重定向后,浏览器会根据服务器的反馈得知资源位置改变了,之后就会访问新的资源位置。
而关于临时重定向和永久重定向的区别,302的重定向是临时的,所以浏览器的缓存不会变,依然是源路径,在重定向结束可以方便的恢复原状。391

  1. 那么什么时候会使用重定向操作呢?

答上了“更换域名”
参考答案:域名更换,多个域名跳转(主要是为了多个域名引流到主站),网站的调整(改变了目录结构),路径的改变(网页被迁移到了新地址),网页拓展名改变(php缓存html)
只有这几种情况在源路径或域名存在时可能用302

【拓展】302的风险:

  • URL劫持
    有的时候A网址很短,而B网址可能URL很乱。A网址由于更加用户友好,某些搜索引擎比如Google会仍然显示网址A。但是排名算法名不能分清A和B之间的索引关系,所以可能有人做一个简单明了的A重定向到复杂的网址B。这样制作了A的这个不道德的人就可以赚取排名算法的热度,但是内容确是别人生产的B。
  • 网站降权
    由于搜索引擎会认为302跳转是用来干扰结果的非法引用,所以会降权惩罚。
  1. 关于http协议和tcp协议,能解释一下他们的关系和区别吗?

我的回答:首先他们是网络不同层次的协议,tcp协议属于传输层协议,面向了数据的传输。http协议是一个应用层协议,规定了传输的内容的格式。http协议的数据是基于tcp协议进行传输的。
【补充回答】:其实整体上已经回答的很全面了,但是有一个很关键的点没说出来,因为HTTP协议是一种在数据传输之前建立连接(三次握手),在数据传输结束之后就断开连接的(四次挥手)。但http协议通常是无状态的,每次请求和相应之后不保留任何的连接状态。

  1. 讲一下http这么多版本比如http1.0和http2.0的区别和联系

我的回答基本全错,纯在胡扯。【反思】:以后不懂一定要先说明白,不能不懂装懂,很掉分。
【参考回答】:here
http一直在升级优化

  • http0.9
    0.9协议是一个交换信息的无序协议,只用于交换文字。没办法显示图片等信息。
  • http1.0
    1.0协议是最重要的面向事务的应用层协议,协议对每一次请求和相应都建立并且拆除一次连接。
    http1.0规定了浏览器与服务器保持短链接。浏览器与服务器的每次请求都需要建立一个TCP链接。在服务器处理完请求之后立刻断开tcp链接。服务器也不跟踪用户过去的请求。
  • http1.1
    http1.1支持使用长连接,并且默认使用,同一个tcp连接中可以传输多个http请求和响应。减少了“由于多次建立和关闭连接导致的性能消耗和时延”
    http1.1新增了多个状态响应码。
    http1.0认为每台服务器都绑定唯一的IP地址,所以请求消息的URL中并没有传递主机名,但是随着虚拟机技术的发展,一台服务器上的多台虚拟主机共享同一个ip地址。http1.1的请求和相应都支持Host,如果没有Host的话会报一个400的错误。
  • http2.0
    http2.0包含了新的传输格式,本身的1.1是使用文本格式的,而2.0是使用二进制格式的。
    http1.1有一个致命的阻塞的问题,因为没有使用“多路复用”,那么如果达到了最大并发处理量,或者由于串行的文件传输,都会造成多余的等待时间。
    而在http2.0中加入了数据帧和流的概念,也就是把一个消息切片,并且最终浏览器按照顺序进行合并。(有了这个优势,就可以解决串行的文件传输问题了)
    而基于流的http2.0,不管访问同一域名的多少文件,都是一路连接的。大大提高了并发量。
    http2.0的header基于encoder技术被压缩。

【知识补充】URL和URI的关联。
参考回答:here
一看就懂,就不总结摘抄了

  1. 关于header的验证,讲讲你知道的cookie,token,和session。

其实这个本来问的很多很杂,从服务端到客户端,从web到android都提问了,简单做个总结吧。
【参考回答】:https://zhuanlan.zhihu.com/p/631349844
首先三者的作用都是进行身份验证。而cookie和session是搭配使用的。cookie和session二者分别对应在客户端和服务端,通过sessionId建立起联系。
而cookie首先需要解决跨域携带的问题,会遭受CSRF攻击,在客户端存储有信息泄露风险。token不存在这个问题,token里面只包含了用户id,不怕被截取。接下来token既可以存储在客户端又可以存储在服务端,但是效率比较低,因为只有id,一切操作都需要服务端对数据库进行操作。session由于包含了完整的客户信息,这方面的效率就很高,但是由于每个客户端都需要查询,还需要建立session,所以会占用服务器资源。而session单独存储在服务器相对安全。

语言核心

  1. 讲一下java的hashmap,hashcode,hashtable。

没什么好说的,基础题。但是其实关于幂次扩展,0.75阈值的知识点还需要详细看一遍。红黑树的实现和复杂度也要再看看。

  1. 刚刚提到hashmap可能会存在线程安全问题

基础题,从hashmap过渡到多线程从而考操作系统也是常规操作。

  1. 那为什么cocurrentHashmap可以保障线程安全?
  2. 讲一下java的IO流

没学过这方面的,只答上了Reader和Writer两种流。
【参考回答】:https://blog.csdn.net/qq_44715943/article/details/116501936

  • 按照流的方向进行分类分为 Input/Read,Output/Write。(方向相对于内存来说
  • 按照流的类型进行分类:字节流/字符流
    字节流:java.io.InputStream , java.io.OutputStream。字节流是万能的,什么类型的文件都可以读取,无论是图片,视频,声音等,一次读取一个byte。
    字符流:java.io.Reader , java.io.Writer 一次读入一个字符,主要是为了方便文本形式的读入而设计的。注意凡是能用记事本打开,能正常显示内容的,都可以用字符流读入。

无论是任何类型的流,都实现了Closeable接口,都实现了Flushable接口,也就是说都有close()方法和flush()方法

  1. 关于final关键字

感觉答得挺全面的,不知道为什么好像面试官没什么反馈
作用域:对变量,方法,类都可以声明
final变量:final变量经常和static一起使用,当作常量。final变量是只读的,必须初始化。
final方法:final修饰的方法不可以被子类方法重写。final的方法比非final方法快。
final类:final类不能被继承。

  1. final类可能是抽象的吗?

我当时确实有点不确定,想了一下既然不能被继承,而抽象方法必须有实现。所以不可能。(两个关键字就直接是反相关的,final类不可能是抽象的)

  1. 抽象类和接口
  2. 关于java多继承
  3. 如果想实现类似多继承怎么办?
  4. 为什么dart可以多继承?

上面几个问题比较水,答得反馈也整体不错,不做单独答案整理。关于dart的混入和多继承可以看我以前博客(恰饭

方向核心

这里非常痛苦,因为会flutter,但是关于安卓的组件,状态,事件,生命周期都了解甚少。
看来不得不启用kotlin面经了(bushi

【tips】可以从小的flutter项目爆改安卓原生开始做起。从ui到功能,慢慢递进

算法题

  1. 关于矩阵的变换问题
    输入的话比较麻烦,类似于python的二维列表。我是c++写的,按照字符串直接读进来模拟指针处理的。
    话说如果真的要进行翻转,而不是投机取巧换遍历顺序的输出,那么可以1.直接复制一个矩阵空间处理/2.直接先沿左上-右下对角线翻转+每一行翻转/3.类似弦图,沿着半径方向挨个翻转
    法1空间O(n^2),法2空间O(1),法3空间O(n)
    时间复杂度都是O(n^2)

  2. 模拟,给一个由数字串,按照汉语口语描述习惯输出。
    四个字符为一个小块。两个块之间用亿/万进行连接即可。小块内部间隙挨个输出千/百/十即可。
    写了20多分钟,都在踩和填下面的坑:
    需要注意:
    1.在数字中间有多个零时,通常只读一个,比如1005
    2. 类似400这样,以零结尾的,通常不读。(此条可以与上条一起合并)
    3. 但是连续的0有特殊情况,比如 100005,也就是说“万”和“亿”这样模块之间的连接词要输出。
    4. 注意在1在首部的时候有不读的情况比如:180000读作十八万,而1800读作一千八。(这里我指出后,显然hr也没想到,后面就让我不考虑了)

posted @ 2024-03-20 01:29  ZzTzZ  阅读(148)  评论(0编辑  收藏  举报