type
status
date
slug
summary
tags
category
icon
password
2024 字节跳动暑期实习面试
岗位:后端开发-国际电商
📎一面(2024.3.18,已通过)
自我介绍
深挖项目,但是基本都是我准备到的
问了项目如果后期继续扩张要怎么办,涉及一点分布式,一致性哈希
算法题
他先给出一道题然后一直追问,把一道easy逐渐改成了一道mid,讲思路为主
一个坐标轴上有一些数字,请你求出离零点最近的数字。输入一个数字n,然后输入n个数。
输入:
输出:
提问:
- 如果输入的数组是无序的,要怎么做?(遍历求绝对值最小,O(n))
- 如果是上面这样有序的,要怎么做?(二分查找(代码实现),O(logn))
- 如果是有序的,要你求k个离零点最近的数字,你要怎么做?
这里一共讲到了三种方法:
- 优先队列:重载大顶堆,绝对值大的放堆顶,维护一个大小为k的大顶堆即可,时间复杂度O(n * logk),但面试官不满意,说继续优化
- 滑动窗口:维护一个长度为k的滑动窗口,从左向右滑动,直到
abs(nums[left]) < abs(nums[right])
,相当于再往后滑动就不划算了,时间复杂度O(n),但还让继续优化
- 滑动窗口+二分法:先用二分求出离零点最近的数字,然后左右指针分别滑动,判断
abs(nums[left]) and abs(nums[right])
,谁绝对值小就滑动谁,相当于保留绝对值最小的,然后right - left + 1 == k
即可退出得到最终答案,时间复杂度O(logn + k)。
反问:
什么业务?(国际电商,海外tiktok
什么技术栈?(golang,微服务,mysql,kafka ……
📎二面(2024.3.27,已通过)
玄学二面,完全看不出来能不能过,只能说答得差不多(复盘想来还是没完全发挥好,可以再仔细思考再说的)
通过了!感恩面试官!
Golang
- 为什么区块链项目用golang?
- 那如果让你设计一个map,你会怎么做?
- golang里面的map是并发安全的吗?
- 如果同时有多个线程读写map,而且不加锁,会发生什么事情?
Answer:
在 Go 语言中,如果多个 goroutine 同时对一个 map 进行读写操作,而没有通过互斥锁(mutex)或其他同步机制来进行访问控制,会导致竞态条件(race condition)。Go 的官方文档明确指出,map 在并发的读写操作下是不安全的。当发生这样的并发读写时,可能会遇到以下几种问题:
- 程序崩溃:最直接的后果是程序可能会因为“并发 map 读写”(concurrent map read and map write)的错误而崩溃。这是因为当 map 的结构(如哈希表的大小等)在写入时发生变化,而同时有另一个 goroutine 尝试读取或写入相同的 map,内部的数据结构可能处于不一致的状态,导致运行时错误。
- 数据损坏:即使程序没有立即崩溃,未同步的并发访问也可能导致 map 的数据在逻辑上变得不一致。例如,可能出现一些键的写入操作丢失,或者某个键的值被意外地覆盖。
- 不可预测的行为:由于并发读写导致的数据竞争,程序的行为可能变得不可预测。同样的输入在不同的运行时可能会导致不同的输出,这使得调试变得极其困难。
- 你平常是怎么学习的?
- 如果有大量的key放到map里面,同时还会过期,会导致什么情况?(扩容问题,达不到负载因子,导致一直拉链,查找key的时间复杂度变成O(n))
- 如果频繁增删key,会对gc造成什么影响?
Answer:
增加GC压力
频繁的增加和删除操作会创建许多临时的对象(如被删除的值),这些对象最终会变成垃圾需要被收集。随着垃圾对象的增加,垃圾收集器需要更频繁地运行以回收未使用的内存。这会增加GC的压力,可能导致更多的CPU时间被用于垃圾收集,进而影响程序的性能。
影响程序性能
GC运行时,尽管Go的垃圾收集器是并发运行的,设计上尽量减少对程序执行的影响,但在垃圾收集期间,程序的部分或全部工作负载可能会经历暂停(STW,Stop-The-World)。这种暂停会影响程序的响应时间和吞吐量,特别是在高负载或实时性要求高的场景下。
内存使用
频繁的键值对变动可能导致内存使用的波动。虽然删除操作会使对象成为垃圾,由GC回收,但在下一次GC之前,这些内存仍被占用。如果增加操作的速度超过GC的回收速度,可能会暂时增加程序的内存占用,甚至在极端情况下,导致内存不足的问题。
- 如果很多STW,那你要怎么解决这个问题?(答得很奇怪,答了项目里面那个避免gc的操作,但自己又不是很懂。。。)
算法题
lc227 基本计算器Ⅱ(中等)
给定一个字符串,是一条运算,只包含加减乘除和数字,请你计算得到最后结果
输入:
输出:
很简单,但是因为那个stoi,不知道为什么那个编译器它调不出来,搞得一直运行错误,然后就讲了一下思路就结束了。
📎三面(2024.4.3,已通过)
上来居然问了我社团的事情,很神奇
然后问了项目,会比较细一点,问缓存,问数据库,甚至问到表字段设计了
mysql
(1)项目里面的mysql的引擎用的是什么?
(2)Innodb的索引数据结构是什么?
(3)联合索引什么时候索引会失效?
(4)讲一下间隙锁?
智力题
一只猴子,手上有100根香蕉,但一次只能搬运50根,并且每走一公里,他就要吃掉一根香蕉,现在他距离家里有50公里,问他最多能搬几根香蕉回去?
最后还拓展了一波:
一只猴子,手上有B根香蕉,但一次只能搬运K根,并且每走一公里,他就要吃掉一根香蕉,现在他距离家里有X公里,问他最多能搬几根香蕉回去?
他引导了很久很久,然后最后得出说,我们可以用递归回溯来解决这个问题:
假设B = 300, K = 50, X = 50
如果B = 301, k = 1, X = 50 ⇒ 288(回去多搬一根香蕉的情况) / 289
然后k直接递推下去,就可以解到最终结果,时间复杂度是O(2^n)
📎hr面(2024.4.8,已通过)
📎offer(2024.4.28)🎉🎉🎉
- 作者:Kasyn
- 链接:https://kasyn.blog/article/intern-2024-bytedance
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章