【面經(jīng)】字節(jié)-電商-后端開(kāi)發(fā)工程師實(shí)習(xí)-2021.3.26

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

  • 輸入描述:

    1. 第一行輸入 n;
    2. 第二行輸入 n 個(gè)數(shù),表示一個(gè)列表;
    3. 第三行輸入 m,表示接下來(lái)的 operation 次數(shù)
    4. 接下來(lái)輸入 m 行,每行 2 個(gè)數(shù):x y,要求輸出第 x 個(gè)數(shù)到第 y 個(gè)數(shù)的和
    5. 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. 算法1的加強(qiáng)版,輸入的不是一個(gè)列表,而是一個(gè)矩陣
    2. 每次輸入的操作不是兩個(gè)值,而是四個(gè)值,表示 x1 y1 x2 y2 兩個(gè)坐標(biāo)點(diǎn)
    3. 要求輸出 x1 y1 到 x2 y2 之間的子矩陣的和
    4. 寫(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)求量)

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)性增大

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ī)劃算法

環(huán)節(jié)點(diǎn)的走法數(shù)

動(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 入職。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容