暑期实习面经

美团

笔试 4.27

题型:30题单选题,2题编程题

时间:2小时

单选题主要有计算机网络、操作系统、数据结构、数字找规律、三元一次方程应用题等。

记录单选题涉及到的知识点

  • 有效的子网掩码
  • SQL共享锁和排它锁,其他事务能否读写
  • HTTP2 和 HTTP3 的区别

编程题AC第一题,第二题是一个九宫格魔法阵,周围的数值改变怎么怎么样的,没一点思路。

当时没记录,现在忘了。。

一面 5.16

  • ✅️ C和C++的区别
  • ❌️ 子结构体对父结构体函数的重写
  • ✅️ 进程和线程的区别
  • ✅️ 同步和异步的区别?为什么需要异步?多线程操作时可能出现什么问题?
  • ❌️ OSI七层网络模型
  • ✅️ HTTP和HTTPS的区别?HTTP全称是什么?HTTPS的S指什么?
  • ✅️ TCP和UDP的区别
  • ✅️ 为什么要三次握手
  • ✅️ 服务器如何知道请求中的不同类型的数据格式?
  • ❌️ 编程题:翻转链表

全都是考基础,没问项目没问实习。

开头自我介绍,然后问我熟悉什么语言,C++或Java会吗,一开始就是打算考编程语言。

C和C++的区别,答:一个是面向对象一个是面向过程,C++有输入输出流

然后出了个题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct A {
f() { printf('A'); }
};

struct B : A {
f() { printf('B'); }
};

int main() {
A a = A();
B b = B();
a.f();
b.f();
return 0;
}

问输出是什么。又问给Bf()加上virtual,输出是什么。

最后一题考编程题,两非递减数组原地排序,LeetCode上刷过,心中窃喜,结果语言切到C++,判题器有点问题没给提交模板,判不了题直接编译错误,面试官也弄不明白,就给我换了一题翻转链表,结果没做出来,被自己的抽象操作蠢哭了…… T^T

最后面试官还指出了我的不足。在我做编程题的时候他看了我的Github和博客,说我项目是足够的,但是要注重基础,编程语言的基础和底层,计网、数据结构四大件的基础等。

还是第一次有面试官给我提建议,发觉不同面试官之间面试方式还是有挺大差距的,有的没怎么问编程语言,有的不怎么问实践。

饿了么

答的很烂……就没几个问题是答出来的 T^T

共四十多分钟。

  • ✅️ 自我介绍
  • ✅️ 详细讲一下实习期间做了哪些事情?实现的细节?
  • ❌️ LazyColumn和Column有什么区别?为什么能提升性能?
  • ❌️ 长列表的数据如果一次性加载会卡顿,如何处理?分页查询相关。如何刷新?前一页的数据如何处理?
  • ❌️ Flutter三个树?嵌套的组件渲染绘制的步骤?
  • ✅️ UDP和TCP的区别
  • ❌️ 2M的数据流,通过TCP发送,要经过哪些步骤?
  • ❌️ APP的启动过程
  • ✅️ Activity的生命周期?两个Activity跳转其分别的生命周期函数调用顺序?哪些情况下不会进入onStop?
  • ❌️ 说一下快排
  • ✅️ 最大递增子串
  • ✅️ 链表翻转

长列表性能问题应该是想问RecyclerView四级缓存机制吧。即Scrap缓存Recycle缓存ViewCacheExtension缓存RecycledViewPool缓存

RecyclerView在滚动时会复用已经存在的ViewHolder对象,而不是每次都创建新的ViewHolder。这样做的好处是减少了对象的创建和销毁次数,提高了内存利用率和性能。当列表项滚出屏幕时,对应的ViewHolder会被移除并加入到RecyclerView的内部缓存池中,当新的列表项需要显示时,RecyclerView会尝试从缓存池中获取可用的ViewHolder对象,避免了重新创建ViewHolder。

RecyclerView提供了setItemViewCacheSize()方法来设置缓存的ViewHolder数量。通过适当调整这个值,可以控制缓存的大小,避免过多的缓存导致内存占用过高。

Flutter三棵树指的是Widget树Element树RenderObject树

Activity的生命周期和启动模式详解

Fragment在显示到销毁的过程中会执行自己的生命周期:onAttach -> onCreate ->onCreateView -> onActivityCreate -> onStart -> onResume -> onPause -> onStop -> onDestroyView -> onDestroy -> onDetach

同时也受到Activity生命周期的影响,如果Activity触发onPause,Fragment也会执行相应的onPause。

阿里智能信息

一面挂,四十五分钟。

  • ✅️ 编程题:URL combo - 字符串分割
  • ✅️ 编程题:统计网页中出现了几种HTML元素
  • ❌️ Array如何转化为Set
  • ✅️ 自我介绍,说一下学习和项目经历
  • ✅️ 为什么学习Flutter?Flutter优势何在?
  • ✅️ Flutter三棵树分别起什么作用?
  • ❌️ Flutter状态管理相关,子组件如何与父组件通信?
  • ❌️ Flutter如何与底层原生通信,如image_picker调用系统相机的原理?
  • ❌️ 说一下MQTT协议?有什么特性?为什么物联网用MQTT?MQTT是基于TCP还是UDP?
  • ❌️ 说一下 HTTP1.0 和 HTTP2.0 的区别
  • ❌️ 说一下前端工程化?Vite有什么优势?
  • ✅️ 为什么没有选择客户端开发?
  • ✅️ 未来规划读研还是就业?

编程题:URL combo - 字符串分割

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 以下是天猫首页一个经过 combo 的 js 资源 url,请找出 combo 规律并用 js 写一个可复用的函数来解该 url,得到每个 combo 前的 url 地址。

const urlStr = 'https://g.alicdn.com/??code/npm/web-rax-framework/0.6.5/dist/framework.web.min.js,mtb/lib-windvane/2.1.8/windvane.cmd.js,mtb/lib-promise/3.1.3/polyfillB.js,mtb/lib-mtop/2.4.0/mtop.js,mtb/lib-login/1.5.3/login.js';

function unComboUrl(url) {
// 以'/'分割,还原出baseUrl
// 再以逗号分割,将每一项与baseUrl合并
const l = url.split('/')
const baseUrl = l[0] + '//' + l[2] + '/'
var list = url.split(',')
for (let i = 0; i < list.length; i++) {
if (i == 0) {
console.log(list[0])
continue
}
list[i] = baseUrl + list[i]
console.log(list[i])
}
}

unComboUrl(urlStr)

编程题:统计网页中出现了几种HTML元素

一开始没写出来,因为我没法用DOM操作提取出HTML标签,后来面试官改成字符串:

1
2
3
4
5
6
// 在一个网页中,用尽可能少的代码,计算出当前网页用了多少种 HTML 元素。

// 遍历字符串,遇到`<`则开始识别HTML标签,`>`或空格前的即为标签,将其入栈
// 遇到`</`则为闭标签,识别后将栈顶对应标签出栈,若栈顶不匹配,则说明栈顶是非闭合标签,同样出栈,直到匹配为止
// 若是形如`<img />`的标签,则不用入栈进入下一步
// 将出栈的标签加入集合,得到无重复的标签,集合大小即HTML种类数量

HTTP1.0 和 HTTP2.0的区别:

HTTP1.0:

  • 单一请求-响应模式:每次请求-响应都需要建立一个新的TCP连接,这个过程包括三次握手,增加了延迟
  • 无状态连接:每个请求都是独立的,服务器不维护客户端的状态
  • 请求头和响应头冗余:每次请求都会发送完整的头部信息,导致数据冗余和效率低下
  • 文本协议:所有的请求和响应都是基于文本的,解析速度相对较慢
  • 有限的并发:因为每个请求都需要一个单独的TCP连接,浏览器通常限制同一域名下的并发连接数,通常是4到6个

HTTP2.0:

  • 多路复用:实现了多路复用,允许在单个TCP连接上并发多个请求-响应对,从而减少了连接的数量和延迟
  • 二进制协议:相对于HTTP/1.0的文本协议,HTTP/2.0采用二进制格式,解析更高效
  • 头部压缩:使用HPACK压缩算法来减少头部信息的大小,从而减少带宽消耗
  • 服务器推送:服务器可以主动向客户端推送资源,而无需客户端明确请求,这样可以减少延迟并提高性能
  • 流优先级:客户端和服务器可以通过设置流优先级来优化资源的传输顺序
  • 连接管理:更有效的连接管理机制,通过单个连接处理多个并发请求,减少了连接建立和维护的开销
  • 改进的安全性:虽然HTTP/2.0可以在明文(HTTP)和加密(HTTPS)下工作,但通常与TLS(传输层安全协议)结合使用,以提供更好的安全性