Skip to content
GitHub Twitter

面试总结

3 月 11 日,面试 上海乐客旅行 Golang 工程师

笔试环节

一共是四题,大体都很简单,只是第二题有点懵。

  • 手写冒泡,很基础的题。

  • 实现 document.getElementById() ,懵了。

  • 以 O(1) 的时间复杂度从栈中取出最大或最小的元素。
    我给的答案是维护一个单调递减栈和一个单调递增栈和一个普通栈。 当添加元素时,查看单调递减栈的栈顶的元素是否大于当前要添加的元素,大于则压入栈单调递减栈,再压入普通栈。单调递增栈的操作与其相反。如需要弹出栈,则比较普通栈的栈顶元素是否与单调递增栈、单调递减栈的栈顶元素相等,如相等,对应单调栈也应弹出。总体实现取出最大或最小元素 O(1) 时间复杂度。

  • 一堆硬币中找出假硬币,经典二分查找法。

自我介绍环节

balabalabalabala.

提问环节

  • Q: 你是从什么地方了解 Golang 的?Golang 的优点?
    A1: 从程序员社区了解。
    A2: 语法简洁,容易学习,运行高效、安全、跨平台,在并发场景易用性高。总体来说取决于应用场景。

  • Q: 如何尽量减小结构体所占的内存?
    A: 传入大对象用指针,小对象用结构体;使用基本数据类型,比如 int32 而不是 int;尽量使内存对齐。

  • Q: 内存对齐的原理?
    A: 结构体的对齐大小等于其最长字段的对齐大小。如果一个字段的大小超过了其前面字段的对齐方式,则该字段会被放在下一个对齐位置开始的位置上;如果一个字段的大小不是结构体的对齐大小的整数倍,则会添加 padding 补充。Golang 中会自动进行内存对齐。

  • Q: 有个任务,超时之后取消,该怎么做?

  • A: 使用 Context.WithTimeout(),将 context 传入任务方法中,函数尾部用 select 进行阻塞,如果超时了,满足 select 中的 case: <- context.Down(),结束超时任务。

  • Q: 限制一段时间内一个客户端只能发十次请求该怎么做?

  • A: 创建一个 map,key 为 ip,value 是包含两个字段:近期第一次请求时间、近期请求次数。前端发来请求时,先判断时间是否超过了十分钟,超过则刷新请求次数,否则查看请求次数是否超过10,超过则拦截。(不知道有没有更好的办法)

  • Q: Mysql 如何优化查询速度

  • A: 加一层 Redis缓存;字段加索引,查询时覆盖索引,保证查询语句里面的字段都在索引文件中;优化查询语句,比如先查索引中包含的字段,在子查询中判断接下来的查询逻辑。

  • Q: 怎么检查是否已经覆盖索引?

  • A: 使用 explain,explain select id, name from user where name = 'puffpuff'

项目

准备不太充分😥。

  • Q: 如何实现给帖子按热度排序?

  • Q: 帖子热度在什么时候刷新?

面试官评价

基础不错,项目准备不充分。