3/19 通過(guò)之前實(shí)習(xí)的leader直接內(nèi)推,沒(méi)有筆試,直接通知面試。
3/26 一二面連面:面完第一面,一面面試官說(shuō):之后會(huì)有二面的面試官來(lái),你稍等一下。我才知道,這次在線(xiàn)面是一面二面連面。
3/28 HR打電話(huà)約了 3/30 上午進(jìn)行三面。
4/7 HR面(和之后對(duì)接的HR xjj 不是同一個(gè),所以這個(gè)HR面應(yīng)該是部門(mén)HR)
4/13 HR xjj 加了微信,發(fā)了 offer,填了信息。
一面 2021.3.26 周五 10.30~11.17
1. 首先自我介紹,然后這位面試官之前在西瓜視頻實(shí)習(xí)的時(shí)候遇到過(guò),所以也沒(méi)那么緊張了
2. 問(wèn)了一下二面的實(shí)習(xí)具體情況,我的負(fù)責(zé)內(nèi)容之類(lèi)的。我講完,他說(shuō):“我給你復(fù)述一下你的工作,你看對(duì)不對(duì)”,然后聊得比較開(kāi)心
3. 然后基礎(chǔ)問(wèn)題略過(guò)不問(wèn)了,出兩道算法題:
算法題1:
-
輸入描述:
- 第一行輸入 n;
- 第二行輸入 n 個(gè)數(shù),表示一個(gè)列表;
- 第三行輸入 m,表示接下來(lái)的 operation 次數(shù)
- 接下來(lái)輸入 m 行,每行 2 個(gè)數(shù):x y,要求輸出第 x 個(gè)數(shù)到第 y 個(gè)數(shù)的和
- n m 很大,要求整體輸出時(shí)間 < 1s
示例如下:
5 ~ 500w
2 3 1 0 -2
3 ~ 500w
2 4 | 3+1+0=4
1 4 |2+3+1+0=6
2 5 | 3+1+0+-2=2
time < 1s
----
4
6
2
- 我的代碼:
class Solution:
def __init__(self, n, l):
self.n = n
self.l = l
self.generate_sum()
def generate_sum(self):
self.s = [0]
for i in self.l:
self.s.append(self.s[-1] + i)
print(self.s)
def A(self, start, end):
if end > len(self.s) or start < 1 or start > end:
return -1
return self.s[end] - self.s[start-1]
if __name__ == "__main__":
n = 5
l = [2, 3, 1, 0, -2]
op = [[2, 4], [1, 4], [2, 5]]
s = Solution(n, l)
for p in op:
print(s.A(p[0], p[1]))
算法題2:
-
輸入描述:
- 算法1的加強(qiáng)版,輸入的不是一個(gè)列表,而是一個(gè)矩陣
- 每次輸入的操作不是兩個(gè)值,而是四個(gè)值,表示 x1 y1 x2 y2 兩個(gè)坐標(biāo)點(diǎn)
- 要求輸出 x1 y1 到 x2 y2 之間的子矩陣的和
- 寫(xiě)出計(jì)算公式即可,不需要代碼實(shí)現(xiàn)
示例如下:
1 2 3 4
5 6 7 8
9 1 2 3
2 2 3 3 | 6+7+1+2=16
q(x1,y1,x2,y2) = ???
- 我的代碼:
x1, y1, x2, y2 = 2, 2, 3, 3
q(x1, y1, x2, y2) = s[x1-1, y1-1] - s[x1-1, y2] - s[x2, y1-1] + s[x2, y2]
m = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 1, 2, 3]]
s = {}
s[x1-1] = {}
s[x2-1] = {}
s[x2] = {}
s[x1-1][y1-1] = 1
s[x1-1][y2] = 1 + 2 + 3
s[x2][y1-1] = 1 + 5 + 9
s[x2][y2] = 1 + 2 + 3 + 5 + 6 + 7 + 9 + 1 + 2
print(s[x1-1][y1-1] - s[x1-1][y2] - s[x2-1][y1] + s[x2][y2])
然后繼續(xù)問(wèn):你的 s 怎么計(jì)算得到,同樣寫(xiě)出公式
s[x, y] = -s[x-1, y-1] + s[x, y-1] + s[x-1, y] + m[x, y]
-
算法題總結(jié)
第一題很簡(jiǎn)單,做出來(lái)的也很快
第二題邊界很麻煩,寫(xiě)錯(cuò)了兩次。還是需要自己寫(xiě)出來(lái)驗(yàn)算一下的。
4. 然后問(wèn)了一道系統(tǒng)設(shè)計(jì):
問(wèn)題描述:
- 我們是電商方向嘛,問(wèn)你一道電商題吧,PM的一句話(huà)需求:我想要你做出來(lái)一個(gè)消費(fèi)排行榜,要前100名的用戶(hù)排行榜,并能實(shí)時(shí)更新。
- 考慮的幾個(gè)點(diǎn):你怎么生成這個(gè)排行榜;你的技術(shù)選型;對(duì)于排行榜數(shù)據(jù),用戶(hù)請(qǐng)求量是多大;在高并發(fā)下你如何提供穩(wěn)定的服務(wù);后續(xù)你的排行榜如何更新。
- 你擁有的數(shù)據(jù):歷史訂單信息(包含 user id,timestamp, cost, state 比如待支付,已支付)
我的思路:
- 分為在線(xiàn)的信息統(tǒng)計(jì)、離線(xiàn)歷史信息的統(tǒng)計(jì)和提供查詢(xún)服務(wù)三部分。
- 在線(xiàn):
采用在線(xiàn)計(jì)數(shù)器(類(lèi)似公司內(nèi)部的 counter service 服務(wù))進(jìn)行在線(xiàn)的用戶(hù) cost 計(jì)算更新,每次訂單支付,都通過(guò)過(guò)濾規(guī)則從上報(bào)的訂單信息中挑選出來(lái),并累加到計(jì)數(shù)器內(nèi)。(面試官問(wèn):你知道 CS 怎么實(shí)現(xiàn)的么?我說(shuō)當(dāng)時(shí)只是用了一下,具體實(shí)現(xiàn)沒(méi)細(xì)看,但是大概知道流程,然后講了一下)
定一個(gè)時(shí)間節(jié)點(diǎn)開(kāi)啟計(jì)數(shù)器,比如2021.3.27零點(diǎn),然后在線(xiàn)數(shù)據(jù)就維護(hù)起來(lái)了,其次需要計(jì)算歷史數(shù)據(jù),并將每個(gè)用戶(hù)的歷史cost之和加到計(jì)數(shù)器上面 - 離線(xiàn):
假設(shè)用戶(hù)量 1000w,歷史訂單 10億 條(截止到 2021.3.27 零點(diǎn))
將用戶(hù)所有的 user id 進(jìn)行 hash 分發(fā)到 100(或者更多) 個(gè)服務(wù)器上面,每個(gè)服務(wù)器掃描歷史訂單計(jì)算 10w 用戶(hù)的歷史數(shù)據(jù),然后利用 100 節(jié)點(diǎn)的最小根堆來(lái)統(tǒng)計(jì)前 100 的用戶(hù),同時(shí)每個(gè)用戶(hù)的計(jì)算結(jié)果保存,發(fā)送更新到計(jì)數(shù)器內(nèi),實(shí)現(xiàn)計(jì)數(shù)器的歷史值初始化
100 個(gè)服務(wù)器跑完之后,搜集 100 個(gè) 前100 排行榜,然后統(tǒng)計(jì) 1w 用戶(hù)的排行榜前100,得出初始化的排行榜,并保存。 - 提供查詢(xún)服務(wù)
將排行榜保存(比如數(shù)據(jù)庫(kù)內(nèi)做備份,redis 做緩存),然后計(jì)數(shù)器每次增加都去查詢(xún)一下是否超過(guò)排行榜的第100名(也需要判斷自己是否在排行榜內(nèi)),超過(guò)了就去更新排行榜。
服務(wù)器集群通過(guò)查詢(xún) redis 進(jìn)行排行榜的數(shù)據(jù)提供。(請(qǐng)求量可能特別大,導(dǎo)致 redis 扛不住,所以需要 local cache 存到本機(jī),先查詢(xún) local cache,失效了再去請(qǐng)求 redis)。
(單用戶(hù)信息不一致問(wèn)題):如果利用了 local cache,會(huì)因?yàn)楦聲r(shí)間不同,導(dǎo)致不同的服務(wù)器上面內(nèi)存信息不一致的現(xiàn)象,從而導(dǎo)致用戶(hù)每次刷新看到的排行榜不一致。需要在排行榜上面添加一個(gè) timestamp,表示當(dāng)前排行榜生成的時(shí)刻,從而在客戶(hù)端能夠通過(guò) timestamp 實(shí)現(xiàn)展示最新的排行榜的能力。
(多用戶(hù)信息不一致問(wèn)題):盡量縮短 local cache 的緩存時(shí)間(比如3s 或者 5s,這樣 redis 能 hold 住請(qǐng)求量)
- 在線(xiàn):
5. 后續(xù)簡(jiǎn)單聊了聊
面試官是在西瓜視頻,然后轉(zhuǎn)到了番茄小說(shuō),然后轉(zhuǎn)到了電商。
讓我繼續(xù)等等,二面面試官馬上來(lái)(?。。。∵B面?。?!好累~~~)
二面 2021.3.26 周五 11.20~12.13
1. 首先自我介紹
2. 沒(méi)問(wèn)基礎(chǔ),大概了解了一下實(shí)習(xí)內(nèi)容,然后問(wèn)了一下常見(jiàn)的debug方式
發(fā)現(xiàn) goroutine 過(guò)多怎么辦?怎么排查?
幾種情況:首先去看看是不是請(qǐng)求量激增,導(dǎo)致 goroutine 創(chuàng)建過(guò)多;然后可能是 goroutine 積攢,一般情況是數(shù)據(jù)讀取部分阻塞了 goroutine,導(dǎo)致積攢過(guò)多;再去排查一下是不是代碼里面循環(huán)創(chuàng)建 goroutine,排查一下循環(huán)條件是不是合法。發(fā)現(xiàn)自己的代碼 gc 過(guò)多,導(dǎo)致服務(wù)不穩(wěn)定,怎么排查
打點(diǎn)看看,比如接入公司內(nèi)部的 grafana,看下對(duì)象數(shù)是不是過(guò)多,如果不是,那么查一下 go 的環(huán)境,是不是 gc 時(shí)間設(shè)置的太短了,導(dǎo)致頻繁 gc;其次如果對(duì)象過(guò)多,那么考慮是不是可以復(fù)用對(duì)象,利用 go 的 pool 庫(kù)來(lái)實(shí)現(xiàn)對(duì)象復(fù)用。怎么查看日志
跳板機(jī)跳到相關(guān)的服務(wù)器上面,然后用 linux 的 shell 語(yǔ)言去提取一下日志,看看是不是能看出一些問(wèn)題。或者添加降級(jí) debug 日志,打開(kāi)降級(jí)開(kāi)關(guān),再去服務(wù)器上面看日志。公司也有動(dòng)態(tài)日志的網(wǎng)頁(yè)可以查看。如果自己的服務(wù)頻繁超時(shí)怎么辦
這會(huì)觸發(fā)熔斷機(jī)制,就是 grpc 框架的一個(gè)機(jī)制,當(dāng)一個(gè)服務(wù)請(qǐng)求另一個(gè)服務(wù),發(fā)現(xiàn)超時(shí)過(guò)多,就會(huì)阻斷請(qǐng)求,返回默認(rèn)值,讓下游恢復(fù)一下。
首先看下是不是自己的服務(wù)確實(shí)不穩(wěn)定,然后排查一下耗時(shí)的操作,去看看能不能優(yōu)化;還有就是如果自己的服務(wù)確實(shí)需要的時(shí)間比較長(zhǎng),比如 200ms,但是上游限制超時(shí)時(shí)間是 150ms,那就得溝通一下,讓上游放寬超時(shí)限制。火焰圖知道么,簡(jiǎn)單說(shuō)一下?
火焰圖展示的就是每個(gè)函數(shù)的調(diào)用延時(shí),以及每個(gè)調(diào)用的函數(shù)的延時(shí),從上到下,中間的空隙有可能就是操作系統(tǒng)層面的函數(shù)脫棧以及調(diào)度的耗時(shí)。如果發(fā)現(xiàn)了某個(gè)函數(shù)耗費(fèi)時(shí)間比較大,就可以去相關(guān)的函數(shù)內(nèi)部去優(yōu)化對(duì)應(yīng)的邏輯。
3. 然后問(wèn)了一道系統(tǒng)設(shè)計(jì)
問(wèn)題描述
設(shè)計(jì)一個(gè)限流器,滿(mǎn)足100w QPS 的限流。我的思路
令牌桶。100w的計(jì)數(shù)器,然后每次請(qǐng)求去獲取令牌,拿到就請(qǐng)求,拿不到就丟棄或者等待,等待超時(shí)就丟棄。
然后面試官問(wèn)怎么實(shí)現(xiàn)?我回答了,然后不滿(mǎn)足他的要求,讓我繼續(xù)優(yōu)化。
然后我說(shuō)在代理層面做,他說(shuō)不一定能抗住這么大的請(qǐng)求量,你的處理延時(shí)怎么處理。
然后我說(shuō)分發(fā)在每個(gè)服務(wù)器上面做,每個(gè)服務(wù)器限小流,然后如果負(fù)載均衡就可以實(shí)現(xiàn)整體限流滿(mǎn)足要求。
面試官說(shuō),你這得業(yè)務(wù)去寫(xiě)相關(guān)的邏輯?你不是在架構(gòu)端實(shí)習(xí)了嘛
我說(shuō),在 grpc 中間件中做,這樣在業(yè)務(wù)生成代碼的時(shí)候,grpc 中間層就生成好了。
然后面試官說(shuō),那你還有別的設(shè)計(jì)方案么?
我想不出來(lái)了,然后他的意思是我沒(méi)滿(mǎn)足他的要求(我也不太清楚他要我實(shí)現(xiàn)什么樣子的要求。)
2. 突然思路回到了第二問(wèn)
- 你不是用了 local cache 啊 redis 啊 abase 啊 mysql 啊,公司還有 ByteDB等,你說(shuō)一下它們的區(qū)別?什么場(chǎng)景下用什么緩存?
簡(jiǎn)單說(shuō)了一下 mysql,分庫(kù)分表 mysql,提升了查詢(xún)能力,但是分庫(kù)分表會(huì)導(dǎo)致 primary id 重復(fù),因此 python 或者 go 操作的時(shí)候需要利用 sql 讀取而不能用對(duì)象映射(否則同 id 會(huì)覆蓋,導(dǎo)致讀取的條數(shù)少)。
他問(wèn):能不能解決這個(gè)問(wèn)題?(能,說(shuō)了一下第二個(gè)實(shí)習(xí)經(jīng)歷中的 SnowFlake 算法來(lái)生成 id,寫(xiě)入的時(shí)候指定 id,這樣就不會(huì)重復(fù)了)
繼續(xù)問(wèn): redis 和 abase 呢?
我說(shuō),redis 全在緩存內(nèi),所以支持的場(chǎng)景是請(qǐng)求量多,時(shí)延要求高,但是數(shù)據(jù)可丟失的情況,即便是公司內(nèi)部有一種持久化 redis,它的持久化也是有延遲的,并不是 set 完就能落地,所以不能信任其落地措施。而 abase 則是可以實(shí)現(xiàn) set 即落地,底層是通過(guò)分布式文件實(shí)現(xiàn)的,一個(gè)大文件分成很多小文件,查詢(xún)的時(shí)候減少讀取的io次數(shù),從而提高并發(fā)量。
問(wèn):那 abase 底層是怎么實(shí)現(xiàn)的? 我說(shuō)是通過(guò) HDFS,但是具體我也沒(méi)了解
然后我繼續(xù)說(shuō) local cache,local cache 的話(huà),當(dāng)時(shí)也調(diào)研了一些 go 的開(kāi)源庫(kù)實(shí)現(xiàn)方法(面試官打斷了,不聽(tīng)了)
4. 然后出了一道算法題:
算法題1:
輸入描述:
輸入一個(gè)列表 l,列表元素不重復(fù);輸入一個(gè) s 值,表示所需和是 7
輸出一個(gè)列表 r,該列表包含所有的可能的列表情況(要求每個(gè)列表和為 s,元素從 l 獲取,l 中的列表元素可以重復(fù)使用)示例如下:
輸入:[7, 3, 6, 2], 7
輸出:[[7], [2, 2, 3]]
思路:
先寫(xiě)了一段時(shí)間,但是在 debug 的時(shí)候,發(fā)現(xiàn)輸出沒(méi)有消重,然后在 debug 期間花了一點(diǎn)時(shí)間,面試官直接問(wèn)我的思路是啥,我說(shuō)我用的是回溯法,balabala 怎么實(shí)現(xiàn),但是輸出還沒(méi)消重。
面試官繼續(xù)問(wèn):你是怎么剪枝的?我說(shuō)通過(guò)排序剪枝。
面試官:那你繼續(xù)完成你的代碼吧,實(shí)現(xiàn)出來(lái)我的代碼:
class Solution:
def __init__(self):
self.res = []
def out(self, A, s):
A.sort()
self.A = A
for i, a in enumerate(A):
# 消重最終是在這里,未消重版本 for j in range(s//a, -1, -1)。
# j 表示當(dāng)前元素獲取的個(gè)數(shù),`-1`允許取 0 個(gè) A[i] 元素,`0`表示必須至少一個(gè) A[i] 元素,從而達(dá)到消重
for j in range(s//a, 0, -1):
pre = [a for _ in range(j)]
self.get_list(pre, i+1, s-a*j)
return list(self.res)
def get_list(self, pre, i, s):
if s == 0:
self.res.append(pre)
return
if i >= len(self.A):
return
# print(pre, i, s)
A = self.A
if A[i] > s:
return
a = A[i]
for j in range(s//a, -1, -1):
r = pre.copy()
r.extend([a for _ in range(j)])
self.get_list(r, i+1, s-a*j)
if __name__ == "__main__":
s = Solution()
print(s.out([7, 3, 6, 2], 7))
s = Solution()
print(s.out([7, 3, 6, 2, 1], 7))
5. 終于結(jié)束了
面試官說(shuō)看你對(duì)字節(jié)也蠻了解的,我們這邊電商也發(fā)展很快,挺缺人手。balabala
6. 總結(jié)一下
系統(tǒng)設(shè)計(jì)題整體的開(kāi)放性蠻大的,需要整體考慮,也費(fèi)腦子,題目一上來(lái)覺(jué)得不好下手,不知道從哪兒切入,
而且面試官通常希望你能設(shè)計(jì)出來(lái)的方案考慮到業(yè)務(wù)需求和現(xiàn)實(shí)情況,所以會(huì)不斷追問(wèn)細(xì)節(jié),
這種情況下,如果真的不會(huì)了,就應(yīng)該多跟面試官交流,如果能聊得來(lái),最好問(wèn)問(wèn)他,自己的方案還有哪兒沒(méi)考慮到。
三面 2021.3.30 周二 10.30~11.08
1. 首先簡(jiǎn)單自我介紹,然后介紹了一下第二次實(shí)習(xí)的內(nèi)容和情況
2. 問(wèn)了一些基礎(chǔ)知識(shí)(八股文背吧,我 TCP 相關(guān)的一些沒(méi)背出來(lái))
-
進(jìn)程和線(xiàn)程的區(qū)別。
【面經(jīng)】字節(jié)跳動(dòng)-后臺(tái)開(kāi)發(fā)-2020.4.7
-
虛擬內(nèi)存和共享內(nèi)存是什么。
【面經(jīng)】字節(jié)跳動(dòng)-后臺(tái)開(kāi)發(fā)-2020.4.7
-
信號(hào)量是什么。
CSDN:操作系統(tǒng)之信號(hào)量
信號(hào)量簡(jiǎn)單理解就是鎖,不過(guò)是計(jì)數(shù)器形式的鎖。
-
原子操作是什么。
原子操作的實(shí)現(xiàn)原理
原子操作的原理其實(shí)就是通過(guò)鎖進(jìn)行的,鎖寄存器,鎖總線(xiàn)等。
-
Http 和 Https 的區(qū)別。
【面經(jīng)】字節(jié)跳動(dòng)-后臺(tái)開(kāi)發(fā)-2020.4.7
講了整個(gè)的協(xié)商流程以及加密原理
-
TCP IP 四次揮手。
【面經(jīng)】字節(jié)跳動(dòng)-后端開(kāi)發(fā)-2019秋招
連著三次握手流程一起講了
-
TCP 的 close wait 和 time wait 是什么,有啥區(qū)別
TIME_WAIT和CLOSE_WAIT狀態(tài)區(qū)別
這個(gè)我講錯(cuò)了,我以為是函數(shù)調(diào)用,結(jié)果是狀態(tài),自己balabala了半天。
-
TCP IP 的擁塞控制是怎么實(shí)現(xiàn)的。
【面經(jīng)】字節(jié)跳動(dòng)-后端開(kāi)發(fā)-2019秋招
知乎:TCP 擁塞控制算法
這個(gè)我講了 1 2 3 的流程,但是不知道這是屬于四個(gè)算法的。面試官問(wèn)我,剛剛講了幾個(gè)算法了,我說(shuō)。。我們不是一直在問(wèn)基礎(chǔ)知識(shí)嘛,有講算法么?然后我說(shuō)我不知道了。
- 解答:
TCP擁塞控制主要有四種方法,滑動(dòng)窗口機(jī)制、慢啟動(dòng)機(jī)制、擁塞避免機(jī)制、快速重傳與恢復(fù)。- 滑動(dòng)窗口機(jī)制
在發(fā)送數(shù)據(jù)的時(shí)候,將發(fā)送窗口內(nèi)的數(shù)據(jù)全部發(fā)送,才會(huì)停下來(lái)等待ACK,如果接收到對(duì)方的ACK信息,則滑動(dòng)窗口前移。 - 慢啟動(dòng)機(jī)制
在剛開(kāi)始發(fā)送數(shù)據(jù)的時(shí)候,發(fā)送窗口取一個(gè)較小的值,來(lái)防止網(wǎng)絡(luò)擁塞,同時(shí)探測(cè)對(duì)方的接收能力。如果收到了對(duì)方的ACK回應(yīng),則按照對(duì)方要求的窗口大小來(lái)調(diào)整發(fā)送窗口,否則進(jìn)行窗口的擴(kuò)大。窗口大小一開(kāi)始是1,之后進(jìn)行指數(shù)級(jí)別擴(kuò)大,其中ssthresh為估算的一個(gè)發(fā)送窗口閾值,當(dāng)窗口大小超過(guò)這個(gè)閾值,則之后的窗口每次擴(kuò)大1,不再是指數(shù)級(jí)別的擴(kuò)大。
還有一個(gè)概念是 AIMD(加法增大乘法減小):無(wú)論在慢啟動(dòng)階段還是在擁塞控制階段,只要網(wǎng)絡(luò)出現(xiàn)超時(shí),就是將發(fā)送端的擁塞窗口(cwnd)置為1,ssthresh置為cwnd的一半,然后開(kāi)始執(zhí)行慢啟動(dòng)算法;當(dāng)網(wǎng)絡(luò)頻發(fā)出現(xiàn)超時(shí)情況時(shí),ssthresh就下降的很快,為了減少注入到網(wǎng)絡(luò)當(dāng)中的分組數(shù),而加法增大是執(zhí)行擁塞避免算法后,使擁塞窗口緩慢的增大,以防止網(wǎng)絡(luò)過(guò)早出現(xiàn)擁塞。 - 快速重傳
快重傳算法要求首先接收方收到一個(gè)失序的報(bào)文段后立刻發(fā)出重復(fù)確認(rèn),而不要等待自己發(fā)送數(shù)據(jù)時(shí)才進(jìn)行捎帶確認(rèn)。當(dāng)發(fā)送方收到ACK之后,進(jìn)行相應(yīng)的報(bào)文重傳。 - 快速恢復(fù)
當(dāng)發(fā)送方連續(xù)收到三個(gè)重復(fù)確認(rèn)時(shí)(代表丟了三個(gè)包),執(zhí)行“乘法減小”算法,慢啟動(dòng)門(mén)限減半,從而預(yù)防網(wǎng)絡(luò)發(fā)生阻塞。由于發(fā)送方現(xiàn)在認(rèn)為網(wǎng)絡(luò)很可能沒(méi)有發(fā)生阻塞(因?yàn)闆](méi)有超時(shí)),因此現(xiàn)在不執(zhí)行慢啟動(dòng)算法,而是把擁塞窗口(cwnd)值設(shè)置為慢啟動(dòng)門(mén)限減半后的值,然后開(kāi)始執(zhí)行擁塞避免算法,擁塞窗口cwnd值線(xiàn)性增大
- 滑動(dòng)窗口機(jī)制
TCP和UDP是傳輸層協(xié)議(物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話(huà)層、表示層、應(yīng)用層)
UDP沒(méi)有擁塞解決措施,當(dāng)網(wǎng)絡(luò)擁塞時(shí),直接丟掉UDP的包。解決方式:在傳輸層之上,利用UDP并改造:如RUDP(傳輸層)、RTP(應(yīng)用層和傳輸層之間)、UDT(應(yīng)用層)等
3. 做了一道動(dòng)態(tài)規(guī)劃算法

動(dòng)態(tài)規(guī)劃了,設(shè)計(jì)了一下,然后講了思路,面試官說(shuō)思路沒(méi)啥問(wèn)題,就是你的 dp 得二維的,我跟他確認(rèn)了一下。然后開(kāi)始寫(xiě)。
最后的代碼如下:
class Solution:
def __init__(self):
pass
# dp[n][i] i = dp[n-1][i-1] + dp[n-1][i+1]
def A(self, N):
dp = [[0 for _ in range(10)] for _ in range(N+1)]
dp[1][9] = 1
dp[1][1] = 1
for n in range(2, N+1):
for i in range(10):
l, r = (i-1)%10, (i+1)%10
dp[n][i] = dp[n-1][l] + dp[n-1][r]
# print(dp)
return dp[N][0]
if __name__ == "__main__":
s = Solution()
n = 6
print(s.A(n))
n = 10
print(s.A(n))
# 驗(yàn)證 6 10 的輸出
# 20
# 254
4 你了解數(shù)據(jù)庫(kù)么?估計(jì)想問(wèn)點(diǎn)基礎(chǔ)知識(shí)。
我說(shuō)我了解,不過(guò)學(xué)校內(nèi)學(xué)的是比較簡(jiǎn)單基礎(chǔ)的,在第一次實(shí)習(xí)的時(shí)候也用了 mysql abase 和 redis。然后面試官也沒(méi)繼續(xù)問(wèn)了。
5 常規(guī)結(jié)束,你有啥問(wèn)題沒(méi)?
簡(jiǎn)單問(wèn)了一下面試官的具體業(yè)務(wù):負(fù)責(zé)交易,涉及訂單之類(lèi)的。
HR 面 2021.4.07 周三 17.14~17.37
1. 基本上是簡(jiǎn)單聊了聊,問(wèn)了一下之前的經(jīng)歷感悟,還有為什么想來(lái)這里,有沒(méi)有其他的offer之類(lèi)的。
我說(shuō)我有美團(tuán) offer,那邊是做大數(shù)據(jù)的,主要負(fù)責(zé)實(shí)時(shí)計(jì)算,他們催的急,我上午的時(shí)候已經(jīng)拒絕了,準(zhǔn)備來(lái)字節(jié)。
面試官說(shuō),我看你第一段實(shí)習(xí)的時(shí)候,是有過(guò)說(shuō)想學(xué)大數(shù)據(jù)的,那怎么沒(méi)考慮美團(tuán)那邊呢?
我說(shuō),當(dāng)時(shí)是業(yè)務(wù)需求,需要跟大數(shù)據(jù)的 Hive 那邊的分析師對(duì)接,所以想學(xué)習(xí),這樣能夠減少業(yè)務(wù)溝通成本,不過(guò)后來(lái)自己也陸陸續(xù)續(xù)了解了一些了,所以作為實(shí)習(xí),還是更愿意到自己完全不熟悉的環(huán)境來(lái)學(xué)習(xí)。之后工作了,可能就沒(méi)有這樣的機(jī)會(huì)了。
2. 然后聊了一下兩次美賽的情況,面試官知道美賽是組隊(duì)的,他問(wèn)我我擔(dān)任了什么角色呢?起到了什么作用?
美賽是三人組隊(duì),第一次和第二次都是同班的,所以一方面是都很熟悉,另一方面是都是計(jì)算機(jī)出身。
在第一段美賽,有一個(gè)出國(guó)的同學(xué),她主負(fù)責(zé)英文論文撰寫(xiě),我和另一個(gè)同學(xué)負(fù)責(zé)算法實(shí)現(xiàn),當(dāng)時(shí)選題 B,做新澤西的收費(fèi)站數(shù)量預(yù)估,我們采用了元胞自動(dòng)機(jī)。一開(kāi)始我倆一起學(xué)習(xí)并編寫(xiě)算法,后續(xù)我脫離出來(lái)一部分精力去跟另一個(gè)隊(duì)員溝通,來(lái)完成論文的撰寫(xiě),所以最終我屬于算法和論文都參與,同時(shí)架起了算法和論文的橋梁的作用。
在第二段美賽,我們選題是 C 題,主要做美國(guó)的石油產(chǎn)業(yè)走向的數(shù)據(jù)分析預(yù)測(cè),組隊(duì)的三個(gè)人不僅僅這次組隊(duì),在任何本科的大作業(yè)我們?nèi)齻€(gè)人都是優(yōu)先組隊(duì)的。因?yàn)槿齻€(gè)人都具有挑戰(zhàn)性,同時(shí)愿意把大作業(yè)弄得復(fù)雜一點(diǎn),一起想辦法實(shí)現(xiàn),關(guān)系也很融洽,不會(huì)推脫事情。在我們隊(duì)內(nèi)部雖然名義上有隊(duì)長(zhǎng),但是更多的是三個(gè)人分別都是隊(duì)長(zhǎng),都會(huì)互相督促,互助互補(bǔ)。所以當(dāng)時(shí)第二段美賽我們是三個(gè)人負(fù)責(zé)了所有流程,都是在一起互相分配任務(wù),互相驗(yàn)收,互相吐槽,互相改進(jìn)。
3. 然后聊了一下能實(shí)習(xí)幾個(gè)月
我說(shuō)之前都是4-6個(gè)月,這次也基本上能保證實(shí)習(xí)時(shí)長(zhǎng),后續(xù)如果能轉(zhuǎn)正的話(huà),也會(huì)考慮。因?yàn)榈谝欢螌?shí)習(xí)其實(shí)已經(jīng)能轉(zhuǎn)正來(lái)著,但是當(dāng)時(shí)考慮到保研成功了,就先回學(xué)校上研究生了。
4. 結(jié)語(yǔ)
面試官說(shuō)后續(xù)會(huì)有另一個(gè)HR同事聯(lián)系我,給我發(fā)Offer。
這次聊完,我的 leader 很快跟我聯(lián)系說(shuō),看見(jiàn)我的 offer 在審批了,如果可以的話(huà)可以先入職,在學(xué)校工作。(我也想早點(diǎn)實(shí)習(xí),奈何現(xiàn)在在弄論文,沒(méi)有別的精力了,o(╥﹏╥)o)
HR Offer 發(fā)放 2021.4.13
HR 小姐姐終于加我的微信了,說(shuō)給我發(fā)了 offer,問(wèn)我,是不是很熟悉流程了,就不多說(shuō)了,我說(shuō)好的,然后十分鐘填完信息,回復(fù)實(shí)習(xí)確認(rèn)。暫定 6.14 入職。