Shopee 2021春招后端面经回忆录
(⑉・̆-・̆⑉)
准备
我的准备时间比较仓促,只有不到一个月的时间(4月11日开始投简历),为了最高效复习并拿到offer,我的准备内容如下:
计算机网络 + 操作系统 + 数据结构 + 数据库 + Redis + 高频面试题 + 高频代码题 + 自己的知识积累(不多) + 自己的项目或实习的总结
- 关于理论知识(八股文)的准备,我推荐该GitHub仓库:Waking-Up (不包含Redis相关内容);
- 关于Redis的知识汇总,可以看我的另一篇博客:Redis面经汇总篇 (应该是全网最通俗易懂最全面的知识点,毕竟我也很想拿到虾皮的offer所以也做足了准备工作);
- 关于高频面试题,我推荐去 牛客网 查对应企业对应职位的面经,比如我查的是:虾皮后端面经 / 虾皮后端一面面经 / 虾皮后端二面面经;
- 关于高频代码题,我推荐该网站:CodeTop ,筛选虾皮后端,就能按照热度和时间对最近考察的手写代码题进行排序,虽然说虾皮的高频考题我没遇上,不过腾讯面试倒是遇到了原题;
- 关于项目或实习的介绍,特别高频,很多次都被面试官刨根问底地问,所以为了在场表现得十分流利,要自己回顾一下,以及自我介绍啊,准备一套固定的逻辑语料。
虾皮的春招流程为 投递 + 笔试 + 一面 + 二面 + hr面 + OC
笔试(4月21日|选择 * 15 + 编程 * 3 )
选择题
# 按题号顺序
- 堆排序是什么排序
- HTTP状态码考察
- 死锁
- 依赖注入
- 二分查找的时间复杂度
- 事务的四大特性
- HashMap的底层原理
- HTTP和HTTPS的区别
- 链表用什么排序好
- 多态机制的作用
- 关于Java异常
- 给定Java代码,判断输出内容
- 面向对象
- hash冲突的解决
- 数据库索引
手写代码(支持本地调试)
""" 第一题:上台阶的游戏 详细描述 一个上台阶的游戏,如果每次只能上1步或者2步;那么一个n级的台阶一共有多少种上法? 要求时间占用、空间占用尽量少,复杂度尽量低。 其他 时间限制: 1000ms 内存限制: 256.0MB 输入输出描述 输入描述:一个整数 输出描述:一个整数 输入输出示例 输入 n = 1 输出 f(n) = 1 """n = int(input().replace("n = ", "")) if n <= 0: print(f'f(n) = 0') elif n == 1: print(f'f(n) = 1') else: result = [1] * (n+1) for i in range(2, n+1): result[i] = result[i - 1] + result[i - 2] print(f'f(n) = {result[-1]}')# 斐波那契数列(另一种解法) def jump_floor(n): dom = math.sqrt(5) return int( (numpy.power((1 + dom) /2, n) - numpy.power((1 - dom) / 2, n)) / dom)
""" 第二题:字符串包含 详细描述 我们定义字符串包含关系:字符串A=abc,字符串B=ab,字符串C=ac,则说A包含B,A和C没有包含关系。 其他 时间限制: 1000ms 内存限制: 256.0MB 输入输出描述 输入描述:两个字符串,判断这个两个字符串是否具有包含关系,测试数据有多组,请用循环读入。 输出描述:如果包含输出1,否则输出0 """str1, str2 = input().split() print(1) if (str2 in str1) or (str1 in str2) else print(0)
""" 第三题:找出数组所有可能的子集 详细描述 给出一个整数数组 nums ,数组中的元素互不相同 。返回该数组所有可能的子集(幂集)。 解集不能包含重复的子集。请按字典顺序返回解集。 其他 时间限制: 1000ms 内存限制: 256.0MB 输入输出描述 输入描述:输入一个含有不同元素的整型数组 输出描述:按字典顺序输出所有可能的幂集 """line = input().replace("[", "").replace("]", "") nums = line.split(",") nums = list(map(int, nums)) result = [[]] n = len(nums) for num in nums: result += [item + [num] for item in result] print(result) """ 好难,做不出来,无法按照字典顺序输出,搞了半天直接给我送走,上面是我的方法,但是无法通过测试用例 """
一面(4月25日|自我介绍 + 问答环节 + 编程 * 3 )
八股
# 按题号顺序
- 哈希冲突(回答不知道…)
- 事务的四大特性ACID
- HTTP的GET/POST请求的区别
- 进程和线程
- Python闭包(也不知道)
手写代码
""" 第一题:两个栈实现一个队列 """class Solution: def __init__(self): self.stackIn = [] self.stackOut = [] def push(self, a): self.stackIn.append(a) def pop(self): if not self.stackOut: while self.stackIn: self.stackOut.append(self.stackIn.pop(-1)) return self.stackOut.pop(-1)solution = Solution() solution.push(1) print(solution.stackIn) solution.push(2) print(solution.stackIn) solution.push(3) print(solution.stackIn) solution.pop() # pop的过程感觉有问题,pop一次全弹出来了 print(solution.stackIn) solution.pop() print(solution.stackIn) solution.pop() print(solution.stackIn) solution.push(4) print(solution.stackIn) solution.push(5) print(solution.stackIn) solution.pop()
""" 第二题:lambda匿名函数表达奇数 """lambda x: x%2 != 0
""" 第三题:合并两个有序数组 """class Solution(object): def merge(self, nums1, m, nums2, n): # m=len(nums1), n=len(nums2) while m>0 and n>0: if nums1[m-1]>=nums2[n-1]: nums1[m+n-1]=nums1[m-1] m -= 1 else: nums1[m+n-1]=nums2[n-1] n -= 1 if m == 0: for i in range(n): nums1[i]=nums2[i]
二面(5月09日|自我介绍 + 项目质询 + 问答环节 + SQL编程 * 1 )
八股
# 按题号顺序
- 数组和链表的区别(内存、扩容),数组怎么扩容(因为我答了这个),为什么随机访问效率高(我也答了这个)
- 数据库范式有哪些,并举例说明(三大范式)
- 数据库的什么列适合创建普通索引(问的时候说索引一般会分为XX索引和XX索引,也就是普通索引,我没听清),group by / order by 为什么创建索引能提高查询速度
- 对于性别这种列适合创建索引吗(不适合,重复性强区分度小),索引创建越多越好吗(不是)
- 浏览器输入域名,请求到达服务器的整个过程(之前也被字节问过),如果是HTTPS发送请求会有什么不同
- 进程和线程上下文切换的区别(我不会,所以我回答了进程和线程的区别)
- 多线程并发会有什么问题(我回答的是会导致死锁,然后针对死锁的特点和死锁如何预防说了很长时间,其实没有完全答对该问题)
- 多线程并发对某个数据进行写入操作会有什么问题(其实最好的回答是把数据库的死锁和Redis的分布式锁都回答上)
手写SQL
""" 有2个表:订单表(order_tab)、订单详情表(子订单,order_detail_tab) 其中订单表的主键是订单详情表的外键,订单表和详情表是1:n的关系, 现在需求是查询订单详情数量大于10笔的主订单ID及其对应的子订单数量,并根据数量降序排序。 Order_tab: order_id、total_amount(总金额) order_detail_tab: detail_order_id、order_id、order_amount(子订单金额) """题目不难,但是我大概有一年半没有写过SQL语句了…所以没写全,最后告诉面试官我的思路是什么😅
复查了一遍牛客的面经,没人手写SQL(甚至二面很多人都没写代码环节…)
hr面(5月13日|聊聊天 )
"""
我找同学要了hr面经,然后自己练习过不同的问题对应的回复。虽然就只是很正常的聊聊天,
但是我觉得有条理的陈述个人状况比随机应变要更加让人舒服,尤其是对于比较内向不善言辞的人,我觉得预先练习非常有必要。
hr面预留的时间是25-30分钟左右,但是我这边十五分钟左右就结束了,问的问题也不少,
但是我不太需要组织就能复述练习过的内容。
"""
# 按题号顺序
- 自我介绍,学业规划(为什么选择读计算机)
- 自己的项目的收获和体会(or实习收获啊 etc.)
- 相对别人而言自己的优势
- 职业规划(超重要,要让hr知道,你不是三心二意或者动不动跳槽的人)
- 怎样的企业能够激发集体荣誉感(因为我在职业规划中提到了企业文化)
- 对虾皮的了解
- 手里有什么offer(或者更想去哪家公司),期望薪资(我重听自己的面试录音被自己整笑了…)
- 反问
- 一些其他可能问到的内容
- 在之前的笔试面试中的优缺点
- 如何解决学习中的困难or问题(如何解决在工作时的人际冲突 etc.)
- 成绩排名,竞赛,奖学金(其实我觉得自我介绍需要包含这些)
hr面这个part如果能够更加从容地介绍自己,具像化地塑造自己,我觉得会OK一些,虽然大家都说hr面貌似仅仅是 聊 聊 天 而已
后记
我的背景其实完全没有优势,无大厂实习经历,无后端项目经历,都是前端和算法的项目,所以在占劣势的前提下,你又想去后端工作,好好准备真的非常重要;
从 2021.04.11 - 2021.05.14 ,一开始我是对虾皮最不抱希望的(顺手投递了…),十分意外地进入了一次次的决赛圈,心态也越来越紧张,准备的也越来越认真。Anyawy,最后的结果是好的,果然,在牛客网许愿超级重要(我二面完当天就在牛客网许愿了)!或者其实是妈妈给我带来了好运(因为妈妈和我姐我弟五一来北京旅游我陪他们玩了四天),二面前后未出hr面的时间里我每天都焦虑得睡不着觉,失眠or噩梦,精神状态也很差,很丧,每当这时候我就会告诉自己我妈都来北京了一定会 bring me Good Luck 的(感谢妈妈虚空之助)!
虾皮的待遇真的太香了,975WLB,我觉得超级人性化,这是我想去虾皮的最重要的理由(也是很多别人的)
最后的最后也po上我发的朋友圈吧,in memory of my first job:
从小到大我一直在扮演普通而不出色的角色,直到现在我依旧无法逃脱这一宿命。这两年我努力了付出了却还是得不到梦校青睐,而我周围的朋友们早已积攒了无数实习经历并且人手offer,四月中旬我开始诚惶诚恐投虾皮的简历,仓促而又慌张地准备每一次面试,想到自己即将失学又失业我经常整晚整晚做噩梦或失眠,伴随着各种身体机能上的并发障碍,觉得生活黯淡又没有曙光,看到大家意气风发的模样我觉得自己特别失败而差劲。今天终于收到了虾皮的OC,走在路上觉得学校的花好鲜艳每棵树都特别而可爱,风拂过面略带冷意,但是却推着我轻快地向前走。感谢这段期间为我提供过帮助的人,给我精神鼓励的人。我已经很长时间不爱发长段的朋友圈了,也不爱向大家袒露自己破败不堪的黑暗面,可能只有当人们意识到自己永远都可以做一个普通平凡的人,而不一定要成为人中之龙,人们才会平静而欣喜地接受生活中路过的每一条岔路。我的朋友我的同学我素未谋面的陌生人,我们都会有光明的未来。