最新字節(jié)跳動(dòng)面試題與答案
1.算法題一:無(wú)序數(shù)組的中位數(shù) (快排思想O(N) 時(shí)間復(fù)雜度)
package com.lightsword.leetcodeproblems
import org.junit.jupiter.api.Test
import java.util.*
/**
* 1.算法題一:無(wú)序數(shù)組的中位數(shù) (快排思想O(N) 時(shí)間復(fù)雜度)
* 中位數(shù)定義: 如果數(shù)組長(zhǎng)度是奇數(shù),最中間就是位置為(n+1)/2的那個(gè)元素。如果是偶數(shù)性含,就是位置為n/2和位置為n/2+1的兩個(gè)元素的和除以2的結(jié)果.
* 例如烦味,
[2,3,4] 的中位數(shù)是 3
[2,3] 的中位數(shù)是 (2 + 3) / 2 = 2.5
*/
class ArrayMidNum {
@Test
fun main() {
val m1 = median(intArrayOf(2, 3, 4))
val m2 = median(intArrayOf(2, 3))
println("m1=$m1")
println("m2=$m2")
//m1=3.0
//m2=2.5
}
fun median(array: IntArray): Double {
val N = array.size
val heapSize = N / 2 + 1
// PriorityQueue通過(guò)二叉小頂堆實(shí)現(xiàn)礁鲁,可以用一棵完全二叉樹表示(任意一個(gè)非葉子節(jié)點(diǎn)的權(quán)值箍铭,都不大于其左右子節(jié)點(diǎn)的權(quán)值)绎晃,
// 也就意味著可以通過(guò)數(shù)組來(lái)作為PriorityQueue的底層實(shí)現(xiàn)蜜唾。
// 首先將數(shù)組的前(n+1)/2個(gè)元素建立一個(gè)最小堆杂曲。
val heap = PriorityQueue<Int>(heapSize)
for (i in 0..heapSize - 1) {
heap.add(array[i])
}
// 然后,對(duì)于下一個(gè)元素 array[i] 袁余,和堆頂?shù)脑?heap.peek() 比較擎勘,如果 array[i] <= heap.peek() ,丟棄之颖榜,接著看下一個(gè)元素棚饵。
// 如果 array[i] > heap.peek() ,則用該元素取代堆頂掩完,再調(diào)整堆噪漾,接著看下一個(gè)元素。重復(fù)這個(gè)步驟且蓬,直到數(shù)組為空欣硼。
for (i in heapSize..N - 1) {
if (array[i] > heap.peek()) {
heap.poll()
heap.add(array[i])
}
}
// 當(dāng)數(shù)組都遍歷完了,那么恶阴,堆頂?shù)脑丶词侵形粩?shù)诈胜。
// 如果數(shù)組長(zhǎng)度是奇數(shù),最中間就是位置為(n+1)/2的那個(gè)元素冯事。如果是偶數(shù)焦匈,就是位置為n/2 和位置為 n/2+1 的兩個(gè)元素的和除以2的結(jié)果
if (N % 2 == 1) {
return (heap.peek()).toDouble()
} else {
// poll()方法獲取并刪除隊(duì)首元素
val a = heap.poll()
val b = heap.peek()
return (a + b) / 2.0
}
// 可以看出,長(zhǎng)度為(n+1)/2的最小堆是解決方案的精華之處桅咆。
}
}
2.算法題二:給一數(shù)組括授,讓你找一對(duì)滿足:i<j && a[i]<a[j] (O(N)時(shí)間復(fù)雜度0(1)空間復(fù)雜度)
3.算法題三: 給一數(shù)組坞笙,讓你找一對(duì)滿足:i<j<k && a[i]<a[j]<a[k] (O(N)時(shí)間復(fù)雜度 O(N)空間復(fù)雜度)
4.三次握手過(guò)程
5.為什么是3次岩饼,而不是2次或4次?
6.介紹下TCP
7.TCP是如何確保傳輸安全的薛夜?
8.TCP和UDP的區(qū)別
9.介紹下hashmap
10.數(shù)據(jù)庫(kù)有了解嗎吮播,介紹下數(shù)據(jù)庫(kù)的索引以及作用
11.數(shù)據(jù)庫(kù)的存儲(chǔ)引擎恨课,介紹一下,以及其數(shù)據(jù)結(jié)構(gòu)
12.數(shù)據(jù)庫(kù)的事務(wù)
13.事務(wù)的特點(diǎn)
14.同步和互斥,鎖
15.DNS 域名系統(tǒng)
16.HTTP和HTTPS的區(qū)別
17.HTTPS的SSL(TLS)協(xié)議
18.進(jìn)程和線程的區(qū)別
19.進(jìn)程通信方式
20.介紹共享內(nèi)存通信方式
21.線程的通信方式
22.synchronized和volatile介紹
23.synchronized和volatile的區(qū)別和應(yīng)用
24.說(shuō)下java的GC算法
25.影響一個(gè)Http服務(wù)最大連接數(shù)的因素是什么
26.一臺(tái)服務(wù)器如何辨認(rèn)一個(gè)請(qǐng)求是誰(shuí)發(fā)送的
27.如何進(jìn)行Token認(rèn)證
28.說(shuō)一下cookie幼驶,為什么要有cookie,cookie中放什么颖低,cookie與session的區(qū)別
29.Https是什么拷窜,建立連接的過(guò)程
30.算法題:給出一個(gè)n*n數(shù)字矩陣,尋找一條最長(zhǎng)上升路徑(數(shù)字越來(lái)越大)咆疗,每個(gè)位置只能向上下左右四個(gè)位置移動(dòng)
31.智力題:2n個(gè)人圍成一圈漓帚,兩兩握手,形成n條線段午磁,線段沒(méi)有交點(diǎn)尝抖。 一共多少種握手方式毡们?
32.說(shuō)說(shuō)你所知道的Java中線程安全的集合類
33.Java中有什么辦法使對(duì)象在各線程中隔離
34.說(shuō)一下ThreadLocal是什么,如何實(shí)現(xiàn)的
35.Redis為什么速度快昧辽,多路復(fù)用講一下
36.項(xiàng)目中為什么用ES衙熔,ES在超大數(shù)據(jù)量下如何優(yōu)化
37.操作系統(tǒng)的分頁(yè)存儲(chǔ),地址轉(zhuǎn)換
38.概率題:兩人拋硬幣搅荞,拋到正面的人獲勝红氯,問(wèn)先拋的人獲勝的概率
39.算法題:給定一個(gè)非空二叉樹,返回其最大路徑和取具。
40.項(xiàng)目流程脖隶,亮點(diǎn)
41.令牌桶算法怎么實(shí)現(xiàn)的
42.線程池是自己創(chuàng)建的嗎?
43.線程池七大參數(shù)都是什么暇检?
44.各個(gè)參數(shù)都是怎樣設(shè)置的产阱?
45.線程池核心線程數(shù)和最大線程數(shù)為什么要設(shè)置成這樣?
46.線程狀態(tài)块仆?怎樣轉(zhuǎn)換的构蹬?
47.object類的方法有哪些?
48.實(shí)現(xiàn)線程同步的方式有哪些悔据?
49.synchronized和reentrantlock的區(qū)別
50.MYSQL事務(wù)隔離級(jí)別及產(chǎn)生的問(wèn)題
51.數(shù)據(jù)庫(kù)的死鎖問(wèn)題
52.MySQL索引為什么用b+樹庄敛?
53.7層網(wǎng)絡(luò)模型
54.tcp和udp的區(qū)別
55.常用的Linux命令
56.算法題:反轉(zhuǎn)鏈表第m到第n個(gè)節(jié)點(diǎn)
57.面向?qū)ο蠛兔嫦蜻^(guò)程
58.繼承多態(tài)封裝及其體現(xiàn)
59.算法題:去除有序數(shù)組中元素重復(fù)出現(xiàn)兩次以上的數(shù)字并返回?cái)?shù)組長(zhǎng)度
60.代理模式 spring aop
61.模板方法模式
62.線程池池化技術(shù)
63.何時(shí)創(chuàng)建核心線程,何時(shí)創(chuàng)建最大線程
64.線程池拒絕策略
65.jmm
66.jvm內(nèi)存區(qū)域
67.垃圾回收算法
68.Java異常體系
69.有沒(méi)有自定義過(guò)異常
70.項(xiàng)目中的數(shù)據(jù)庫(kù)表有哪些映射關(guān)系(一對(duì)一科汗,一對(duì)多藻烤,多對(duì)多)
71.算法題:字符串?dāng)?shù)組的最長(zhǎng)公共前綴
總結(jié)
所有的面試題目都不是一成不變的,特別是像字節(jié)跳動(dòng)這種大廠头滔,上面的面試真題只是給大家一個(gè)借鑒作用怖亭,最主要的是給自己增加知識(shí)的儲(chǔ)備,有備無(wú)患坤检。
上面這些面試題總結(jié)一下兴猩,主要就是這6類:
(1)多線程、集合和Java基礎(chǔ)
(2)spring框架早歇、mybatis框架
(3)MySQL數(shù)據(jù)庫(kù)
(4)高并發(fā)倾芝、分布式
(5)JVM調(diào)優(yōu)、緩存優(yōu)化箭跳、數(shù)據(jù)庫(kù)調(diào)優(yōu)
(6)算法
關(guān)于字節(jié)跳動(dòng)崗位層級(jí)晨另,績(jī)效考核晉升
職級(jí)研發(fā)序列
不少人對(duì)字節(jié)跳動(dòng)技術(shù)崗的體系結(jié)構(gòu)和技術(shù)要求設(shè)置不太清楚,想去面試心里沒(méi)底谱姓,下面簡(jiǎn)單介紹一下字節(jié)跳動(dòng)技術(shù)崗要求體系借尿,并給大家分享一份最新入職字節(jié)跳動(dòng)的同事總結(jié)出的完整面試題!
字節(jié)跳動(dòng)的職級(jí)研發(fā)序列一共5級(jí)逝段,各細(xì)分2級(jí)垛玻,共10 級(jí):
1-1
1-2
2-1
2-2
3-1
3-2
4-1
4-2
5-1
5-2
不同序列間月薪base差異較大割捅,技術(shù)base整體偏高。比如2-1月薪會(huì)在20k+帚桩,2-2的package會(huì)在60w-100w左右(算上期權(quán)亿驾,大概會(huì)占30%左右)。T2-2級(jí)別的薪資約40k账嚎,500股票/每年莫瞬。
字節(jié)跳動(dòng)對(duì)技術(shù)崗的要求
1、3年以上開發(fā)經(jīng)驗(yàn)郭蕉;
2疼邀、精通Java,理解io召锈、泛型旁振、多線程、集合等Java基礎(chǔ)使用和實(shí)現(xiàn)原理涨岁;
3拐袜、熟悉Spring、SpringBoot等框架梢薪,理解JVM的實(shí)現(xiàn)機(jī)制及性能調(diào)優(yōu);
4蹬铺、掌握MySQL使用,熟悉數(shù)據(jù)庫(kù)性能優(yōu)化秉撇;
5甜攀、熟悉主流Key-Value存儲(chǔ)系統(tǒng),能夠進(jìn)行系統(tǒng)性能調(diào)優(yōu)琐馆;
6规阀、掌握Linux 操作系統(tǒng);熟練使用一種腳本語(yǔ)言啡捶,Shell或Python姥敛;
7奸焙、擁有高并發(fā)瞎暑、分布式系統(tǒng)經(jīng)驗(yàn)優(yōu)先;
8与帆、有業(yè)務(wù)系統(tǒng)中臺(tái)化經(jīng)驗(yàn)者優(yōu)先了赌。
有以下經(jīng)驗(yàn)者優(yōu)先:
① 熟練掌握Golang/Python并能靈活運(yùn)用;
② 具有大規(guī)模分布式系統(tǒng)的調(diào)優(yōu)經(jīng)驗(yàn)玄糟,如JVM調(diào)優(yōu)勿她、SQL調(diào)優(yōu)、緩存優(yōu)化阵翎、RPC優(yōu)化等逢并;
③ 熟悉大規(guī)模分布式系統(tǒng)架構(gòu)設(shè)計(jì)之剧,熟悉CAP、Quorum砍聊、Consistent Hashing等原理和算法背稼。
績(jī)效考核與晉升
字節(jié)跳動(dòng)內(nèi)部的績(jī)效考核一共有八級(jí),從低到高為F玻蝌、I蟹肘、M-、M俯树、M+帘腹、E、E+许饿、O阳欲,并會(huì)進(jìn)行強(qiáng)制分布,對(duì)應(yīng)年終獎(jiǎng)和月薪百分比的漲薪陋率。M就有漲薪機(jī)會(huì)胸完。晉升面試也是主要還是看績(jī)效考核。
每年兩次考核翘贮,一般在三月和九月赊窥。考核方式借鑒了google的OKR+360模式:頭條是雙月OKR狸页,可以在lark 上看到所有人的OKR锨能,知道大家在做什么,你對(duì)齊的大目標(biāo)是什么芍耘,支持對(duì)齊你的人在做什么址遇。
360評(píng)估:每個(gè)人都可以評(píng)估別人同樣也會(huì)被別人評(píng)估,無(wú)論是領(lǐng)導(dǎo)還是普通員工斋竞。