-
面试总结
3 月 11 日,面试 上海乐客旅行 Golang 工程师
笔试环节
一共是四题,大体都很简单,只是第二题有点懵。
手写冒泡,很基础的题。
实现 document.getElementById() ,懵了。
以 O(1) 的时间复杂度从栈中取出最大或最小的元素。
我给的答案是维护一个单调递减栈和一个单调递增栈和一个普通栈。
当添加元素时,查看单调递减栈的栈顶的元素是否大于当前要添加的元素,大于则压入栈单调递减栈,再压入普通栈。单调递增栈的操作与其相反。如需要弹出栈,则比较普通栈的栈顶元素是否与单调递增栈、单调递减栈的栈顶元素相等,如相等,对应单调栈也应弹出。总体实现取出最大或最小元素 O(1) 时间复杂度。一堆硬币中找出假硬币,经典二分查找法。
自我介绍环节
balabalabalabala.
提问环节
A: 你是从什么地方了解 Golang 的?Golang 的优点?
Q1: 从程序员社区了解。
Q2: 语法简洁,容易学习,运行高效、安全、跨平台,在并发场景易用性高。总体来说取决于应用场景。A: 如何尽量减小结构体所占的内存?
Q: 传入大对象用指针,小对象用结构体;使用基本数据类型,比如 int32 而不是 int;尽量使内存对齐。A: 内存对齐的原理?
Q: 结构体的对齐大小等于其最长字段的对齐大小。如果一个字段的大小超过了其前面字段的对齐方式,则该字段会被放在下一个对齐位置开始的位置上;如果一个字段的大小不是结构体的对齐大小的整数倍,则会添加 padding 补充。Golang 中会自动进行内存对齐。A: 有个任务,超时之后取消,该怎么做?
Q: 使用 Context.WithTimeout(),将 context 传入任务方法中,函数尾部用 select 进行阻塞,如果超时了,满足 select 中的 case: <- context.Down(),结束超时任务。
A: 限制一段时间内一个客户端只能发十次请求该怎么做?
Q: 创建一个 map,key 为 ip,value 是包含两个字段:近期第一次请求时间、近期请求次数。前端发来请求时,先判断时间是否超过了十分钟,超过则刷新请求次数,否则查看请求次数是否超过10,超过则拦截。(不知道有没有更好的办法)
A: Mysql 如何优化查询速度
Q: 加一层 Redis缓存;字段加索引,查询时覆盖索引,保证查询语句里面的字段都在索引文件中;优化查询语句,比如先查索引中包含的字段,在子查询中判断接下来的查询逻辑。
A: 怎么检查是否已经覆盖索引?
Q: 使用 explain,
explain select id, name from user where name = 'puffpuff'。
项目
准备不太充分😥。
Q: 如何实现给帖子按热度排序?
Q: 帖子热度在什么时候刷新?
面试官评价
基础不错,项目准备不充分。