2021-09-24 21:45:37
两年社招微信五面面经总结
一面(组员面)算法题
找出数组中重复的数字:数组a[N]存放1至N-1,其中某个数字重复一次,要求时间复杂度O(N),空间复杂度非O(N)。
解法:利用数组下标与数值的关系,遍历数组,将数值对应的下标位置的值取反作为标记。若发现某位置的值已为负,则该数值为重复数字。
二叉树路径和:判断是否存在从根到叶子节点的路径,路径上所有节点之和等于给定值。
解法:递归遍历二叉树,累加路径上的节点值,到达叶子节点时判断是否等于目标值。
struct TreeNode { int value; struct TreeNode *left, *right; }; int haspath(struct TreeNode *root, int value) { if (!root) return 0; if (!root->left && !root->right && root->value == value) return 1; return haspath(root->left, value - root->value) || haspath(root->right, value - root->value);}最长上升子序列:参考LeetCode题目
解法:动态规划,维护一个dp数组,dp[i]表示以第i个元素结尾的最长上升子序列长度。
项目与前端基础
Vue父子组件通信:通过$emit和vuex实现。
Webpack优化:
开发时优化:热更新、代码分割、缓存。
生产包优化:代码压缩、Tree-shaking、CDN加速。
Tree-shaking原理:依赖ES2015的import和export语句,检测未使用的代码并消除。UglifyJS等工具实现DCE(Dead Code Elimination)。
Node与浏览器事件循环不同:Node采用事件驱动、非阻塞I/O模型,浏览器事件循环处理DOM事件、网络请求等。
Vue虚拟DOM:
优点:减少直接操作真实DOM的开销,提高性能。
缺点:首次渲染可能较慢,需额外内存存储虚拟DOM。
DOM Diff:通常从左到右比较,通过key值优化比较过程。
防抖与节流:
防抖:执行最后一次触发的事件处理函数。
节流:保证一定时间段内只调用一次事件处理函数。
闭包:函数能访问并记住其词法作用域,即使函数在其词法作用域之外执行。应用场景包括模块化、私有变量等。
HTTP与HTTPS不同:HTTPS在HTTP基础上加入SSL/TLS协议,提供加密传输和身份验证。
WebAssembly:一种可在现代Web浏览器中运行的二进制指令格式,允许高性能应用在Web上运行。
项目相关:深入讨论项目细节和实现。
浏览器事件循环:与一面问题类似,考察对事件循环机制的理解。
Hybrid开发JS与原生交互原理:通过WebView的JavaScript桥接实现JS与原生代码的交互。
String类型:考察对JavaScript中String类型的理解和操作。
算法题
三数之和:给定数组,找出所有不重复的三元组,使和为0。
解法:排序后使用双指针法,避免重复解。
概率题:计算目击证人认定肇事车辆为蓝色的情况下,车辆实际为蓝色的概率。
解法:应用贝叶斯定理,结合目击者识别正确率和车辆市场占有率计算。
面试:项目相关问题,考察项目经验和问题解决能力。
算法题
字符串转数字:根据规则(A=1, B=2, ..., AA=27, ...)将字符串转换为数字。
解法:遍历字符串,根据字符位置计算数字,考虑进位情况。
二叉搜索树的第k大节点:不使用额外存储空间,通过逆中序遍历找到第k大节点。
最长连续递增序列:在整数数组中找出位置连续的最长递增序列。
解法:遍历数组,记录当前递增序列长度,更新最大值。
单链表中间位置节点:使用快慢指针法找到单链表的中间节点。
合并两个有序链表:找出两个有序单链表中value相等的节点,构造成新链表。
解法:遍历两个链表,比较节点值,将相等的节点链接到新链表。
反转数组:在原数组上反转,不使用arr.reverse()方法。
解法:使用双指针法,交换数组首尾元素,向中间移动指针。
面试
项目相关:延伸出H5如何调用原生方法,以及项目中的性能优化手段。
项目相关:讨论成长最快的一段时间、项目迭代周期、重构原因、测试周主要工作、自动化测试等。
H5调用原生方法:与四面问题类似,考察对Hybrid开发的理解。
开放性问题
Web版微信扫码登录原理:延伸至除了轮询外的其他方式,如WebSocket、长轮询,HTTP1.1通过Connection: keep-alive字段设置长链接。
好友列表渲染性能:考虑虚拟列表、分页加载等技术优化渲染性能。
好友头像加载优化:使用图片压缩、懒加载、CDN加速等手段优化大量小图片的加载。
好友搜索功能:考虑使用哈希表、Trie树等数据结构优化搜索性能,避免遍历所有好友。
大文件断点续传:通过记录已上传的文件块信息,实现断点续传功能。
秒传实现:通过计算文件哈希值,判断文件是否已存在,实现秒传功能。
总结:每轮面试均涉及算法题,需重点准备。项目经验及从中延伸的基础问题也是考察重点,需深入理解项目细节和背后原理。前端基础知识考察广泛,注重知识深度和实际应用能力。