上海字節跳動後端研發實習生三面面經

2019年03月30日
我簡歷上寫的技能列表:
計算機網絡、數據結構、算法等課內基礎知識:掌握(沒寫操作系統是因爲沒複習操作系統)
Java 基礎知識:掌握,最近在讀《Java 併發編程的藝術》
Linux 服務器運維相關(Jenkins 自動化部署、腳本編寫、打包發佈等):掌握
JVM 虛擬機:掌握,看過《深入理解 JVM 虛擬機》部分章節
數據庫相關(Mysql、MongoDB):掌握,看過《Mysql 技術內幕-InnoDB 存儲引擎》部分章節
Java 集合類框架底層實現:掌握,閱讀過部分源碼實現
Spring、Spring Boot、Spring Cloud 等:掌握
前端相關:掌握 html+css+javascript,應用 reactJS 框架寫過項目,寫過兩個微信小程序。
Netty:瞭解和使用,看過《Netty 權威指南》部分章節
Redis:瞭解和使用,看過《Redis 設計與分析》部分章節
消息隊列:瞭解和使用

字節跳動一面(55min)

講一下進程和進程之間有哪些關聯?
我聊了進程通信的多種方式,講了父子進程的關係。
數據庫索引?
我提到了聚集索引和非聚集索引,他說只要講聚集索引就可以
我提到了葉子節點存儲數據,非頁節點存儲葉子節點的偏移量
葉子節點之間爲什麼要用雙鏈表而不是單鏈表?
我沒有了解過,但我認爲存在這樣的常見,查到的一個葉子節點,該頁裏的數據不夠完整,還需要向前向後看是否還有滿足條件的數據。
主要還是和一些時間的查詢相關的一些情景(我不太理解)
你剛纔說偏移量,偏移量怎麼理解?
當時我有點懵逼了,現在想想,就是一個子節點的指針,就是一個物理地址,這有啥好問的無力吐槽。
Redis的有哪些數據類型?
5種基本數據類型,作爲key的只有String,他們的內部實現除了跳躍表不大瞭解,其他的都有所瞭解。
Redis的RDB知道麼?
我:我知道RDB可以把內存中的key-value鍵值對持久化到磁盤,通過SAVE和BGSAVE啓動持久化,SAVE會阻塞主進程,BGSAVE會fork一個子進程,BGSAVE執行期間SAVE會被阻塞,這是爲了防止兩個子進程同時調用rdbSave,產生條件競爭。
他:SAVE爲什麼會阻塞?
我:Redis是單線程的設計。
他:讓你自己實現BGSAVE怎麼做?
我:一開始,把內存裏的數據全部拷貝一份,然後把這一份持久化到磁盤,另一份則繼續更新。
他:如果內存中數據量很大呢?你拷貝一份要花多久時間,而且內存空間浪費嚴重。
我:那直接在子進程把主進程的數據持久化到本地(由於父子進程共享數據),在這個過程中,主進程面對新來的修改操作,先把這些修改操作先暫存下來,等到子進程做完了持久化,發一個信號給父進程,在父進程的回調函數中把新的修改、插入、刪除覆蓋老數據。
給定1年的數據,數據記錄包含(登錄時間,登出時間,用戶id),輸入一個時間戳,求出該時間在線用戶數量。(想不出來怎麼做,求指點)
我說掃一遍表,然後每條記錄判斷一下,這樣時間複雜度是O(n)。
他:你不要從算法的角度去考慮,有沒有別的做法,我這樣說是不想讓你鑽進死衚衕。
我:我想了下,我能給出一個近似解,一般用戶也不會登錄很長時間,往前往後一週就可以了,因此對時間建立索引後,先按照時間把輸入時間點的前一週和後一週的記錄篩選出來,這個篩選過程的時間複雜度是O(lgn),這是由數據庫B+樹的查找時間複雜度決定的,然後在篩選出來的數據中,掃描一遍,這樣數據量已經大大減少。因此,整體時間複雜度在數據分佈均勻的情況下可以達到O(lgn)。
他:你再想想別的方法,不要從算法的角度去考慮這個問題
我:我總歸還是想要從空間換時間的角度來考慮問題。
算法題:最大回文字符串

字節跳動二面(50min)

進程、線程、協程的區別與聯繫
Redis中RDB和AOF的區別
AOF中如果一段時間內有很多命令,有的命令冗餘了,這樣都存儲下來會佔據很多空間,你知道他是怎麼解決這個問題的嗎?

AOF的重寫機制,原理是遍歷內存中的鍵,構造出一條命令與之對應,然後存儲下來。
細節是主進程除了執行新來的命令外,還會把命令寫到AOF緩衝區和AOF重寫緩衝區,子進程完成AOF重寫(遍歷父子進程的共享數據)
Redis、Memcache、Mysql、Mongo這幾種數據庫的區別知道嗎?
如何基於RabbitMQ實現一個同步通信框架?
思考之後給出了一個大體的方向和思路
RabbitMQ中的幾種exchange有所瞭解嗎?
我說我簡歷上寫的瞭解,就真的只是瞭解,不會這個,求別問RabbitMQ原理了
InnoDB和MyISAM的區別
balabala,沒有提到行鎖和表鎖
他:你覺得InnoDB和MyISAM誰的性能更好?
我:思考中
他:提示一下,從鎖的角度去分析。
我:哦哦,InnoDB是行級鎖結合表級鎖,MyISAM是表鎖,因此InnoDB效率更好
他:那你講一下數據庫鎖機制
講了S鎖、X鎖、意向鎖的設計原理,以及他們之間的兼容性
講了鎖帶來的幾個問題,提到了幾個隔離級別、MVCC,以及MVCC解決的問題
場景題,一個用戶打開了某個記錄,然後另一個用戶也打開了這個記錄,他們看到的都是同樣的數據,這時候A修改了記錄,B也修改了記錄,A的修改被B覆蓋了,怎麼辦?
我:其實數據庫的事物已經能夠保證丟失更新問題不會出現,但這個問題其實就是邏輯意義上的丟失更新,有兩種解決方案:
1.用戶A的讀數據加寫鎖 select …. for update.
2.無鎖方式實現,用CAS的思想給他描述了一下。
算法題:判斷是否爲鏡像二叉樹
一開始寫的不是最優解,先遍歷自己構造了一顆鏡像二叉樹,然後遍歷對比兩顆樹是否相同。
他:你這樣,浪費了O(n)的空間,並且多了一次掃描
我修改了代碼,一次掃描結束。

字節跳動三面(50min)

聊項目
如何實現讀寫鎖?
用了兩個變量去實現,講了下思路
大佬問兩個變量怎麼實現原子性呢
給這兩個變量的修改加上sychronized
synchronized太重了
想不出來,提示了我用1個數字的位來表示兩個數字,也就不需要對這兩個數字進行一個原子性的保證了。
算法題是最大子樹和(先是必須包含葉子節點的)
做的比較快,二叉樹的後序遍歷寫的比較熟
改了題,說不包含葉子節點也算。
講了下思路,過了。
時間還比較多,我們再做一道算法題吧,講下思路就可以,10億url找頻率topK大?
我給了一種思路的完整答案,另一種思路我想到了前綴樹,在面試官的提示之下給出了答案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章