位元組跳動2020-ByteCamp暑期夏令營研發組習題
概要
本文主要是記錄位元組2020夏令營的筆試習題,解答部分待日後不斷完善。
選擇題部分記錄不是很完全,剩下沒有被收錄的大都偏容易。
單項選擇題
- 箱子裡有20個紅球,18個白球,逐一隨機抽取球,問整個過程中箱外白球至少有一次和箱外紅球相等的概率。
- 求f(x)=x-sinx的零點個數
多項選擇題
- 假設在單核無超執行緒CPU場景下執行如下程式碼「x=x+1,y=y+x」,有三個執行緒分別執行這段程式碼,在所有執行緒開始前,假設有2個變數x,y,x和y都被初始化為1,x和y值會且只會被這三個執行緒修改,執行緒隨時會被搶佔,設該程式碼均為原子的,則可能得到的結果?
填空題
- 有一臺機器,可批量輸入單詞,會返回其翻譯值,但是不知道對應關係,現有1000個單詞,問最少需要()次才可以確定它們的翻譯。
- 幼兒園阿姨買了很多糖果,讓6位小朋友早上自己分糖果,第一個先分成相等6堆,結果發現多出來1顆,於是他吃了一顆然後拿走一堆,剩下五堆;第二個小朋友把五堆合在一起,又分了6堆,結果發現又多了一個,於是他也吃了一顆拿走一堆,剩下的亦如此。問阿姨至少買了多少顆糖。
程式設計題
-
題目描述:
小包有一個紀念日,他特別喜歡這個日子,於是把它以"DD-MM-YYYY" (如:31-01-2020,代表2020年1月31日) 的格式記錄了下來。但小包不想被別人知道這個日子,於是他將這個日子與很多別的日子寫在一起,且該日子的出現次數最多。
小包不小心忘記了紀念日到底是哪天,所以小包現在需要從之前的記錄中找到這個紀念日。輸入描述:
一行一個字串,其中只包含數字和字元"-",字串長度不超過10^5。
2001 <= YYYY <= 2020
01<=MM<=12
DD滿足每個月份的日期數,需要考慮閏年的2月
MM和DD不夠兩位數時會填充前導0,如2020年1月1日會寫成01-01-2020而不是1-1-2020。
輸入保證一定存在一個符合要求的合法的日期,且保證一定存在一個日期出現次數嚴格大於別的日期出現次數。輸出描述:
紀念日日期,以DD- MM-YYYY"的格式。
示例1:
輸入:20-12-2030-12-2020
輸出:30-12-2020
說明:符合條件的日期只有30-12-2020這一個。注意資料中的20-12-2030年份超出了2001 <= YYYY <= 2020範圍,因此不計算在內。
-
題目描述:
位元組跳動有很多個機房,每個機房可能會有很多個網段(如 10.1.2.0/24),網段之間會有包含關係,當出現包含關係時,以小的網段為準。如機房1對應網段10.1.0.0/16,機房2對應網段10.1.2.0/24,那麼現在有一個IP 10.1.2.3,其應當歸屬於機房2。
公司內我們經常會遇到一個場景:要查詢一個IP所在的機房。請你寫一個程式,根據輸入的網段資訊和所需查詢的IP給出所在的機房。為了簡化問題,在這裡我們認為所有IP都是可分配的,即不考慮網段地址和廣播地址,將這兩種地址也認為是可分配地址。
輸入描述:
第一行包含兩個整數n和m。隨後n行,每行有兩部分組成,第一部分是機房編號,第二部分是網段資訊,格式如下:
idc net
隨後m行,每行是一個IP,表示需要查詢的IP。
保證所有的網段以及IP都為IPV4格式,不存在IPV6 的輸入資料。
要注意,輸入可能存在一個大網段被多個小網段切分完畢的情況。資料範圍:
對於30%的資料:1<=n<=10、1<=m<=100;
對於60%的資料,1<=n<=1000、1<=m<=5000;
對於100%的資料,1<=n<=5000、1<=m<=50000。輸出描述:
輸出一共有m行,每行為一個整數,代表第Mi行IP對應的機房編號。
如果所輸入的IP沒有找到對應的網段資訊,就輸出-1。示例1:
輸入:
4 4 1 10.1.2.0/24 2 10.1.0.0/16 1 10.1.5.0/24 2 10.1.2.128/125 10.1.2.3 10.1.2.129 10.3.2.1 10.1.5.2
輸出:
1 2 -1 1
-
題目描述:
兩姐妹小蔓和小玉玩抽牌遊戲:一共n張牌,兩人輪流抽排,先手者的第一次抽可以抽任意張但不可抽完,以後每次抽都只能抽取不超過上一次抽牌數的兩倍(不可不抽)。誰先抽完牌誰贏(沒得抽的算輸)。由姐姐小蔓先抽。假設該遊戲會進行t輪,每輪重新給出新的n。請問先手的姐姐小蔓一共能贏其中的多少輪呢?(注:兩姐妹冰雪聰明,都會做出對自己最優的策略)
輸入描述:
第一行,一個數字t
接下來t行,每行一個數字,n輸出描述:
一個數字x,代表姐姐小蔓贏得輪數
示例1:
輸入:
2 4 5
輸出:1
說明:
2<=n<=1e9
30%的資料(1<=t<=10^3)
60%的資料(1<=t<=10^5)
100%的資料(1<=t<=10^6)
-
題目描述:
我們在使用Tensorflow等編寫神經網路時,為了使程式碼邏輯清晰,可能會造成執行時的低效。小熊寫出瞭如下的計算式:
(p0-(p1 /(p0 + (p3-p4))))+ (p2*(p1 /(p0 + (p3- p4))
在Tensorflow中可以表示為如下圖一,其中p1/ (p0 + (p3 - p4))計算了兩次。還好Tensorlfow提供的XL A(Accelerated Linear Algebra)對此進行了優化,只需計算一次,計算流程被優化為如下圖二形式。
小熊露出了滿意的笑容的同時,開始思考這個過程是怎麼完成的。他已經把這個問題簡化,他使用字首表示法來表示這些計算式,並限定操作符於{+,-, *,/},運算元為單個小寫字母。可描述如下:
E in{a, b,...Z}
f in{t,-,*k,/}
F= f(E, E)
F= f(E, F)令上述表示式中p0=a, p1=b, p2=c, p3=d, p4=e,字首表示法可表示為:
+(-(a,/(b,+(a,-(d,e)))),*(c,/(b,+(a,-(d,e)))))
他希望能將這個表示式的計算節點優化到最少,能不能幫他寫個程式來完成這個任務?
對於每個表示式,將其計算節點優化到最少。並將優化的子表示式以一個數字表示,這個數字指向等於此子表示式的根節點的序號。節點的序號從1開始,按前序遍歷分配,如果是重複節點則不分配編號。如"a+a"可轉換為字首表示式"+(a,a)",第二個"a"發現第一個"a"作為節點(編號2)已經出現過,因此可優化為"+(a,2)",2表示指向編號為2的節點。而在"+(-(a,/(b,+(a,-(d,e)))),(c,/(b,+(a,-(d,e)))))"中,"a"和"/(b,+(a,-(d,e)))"都是重複的, 其中a第一次出現的節點編號為3,"/(b,+(a,-(d,e)))"第一 次出現的根節點"/"編號為4,因此可以優化為"+(-(a,/(b,+(3,-(d,f)))),*(c,4))"。
輸入描述:
第一行包含一個數字c,表示將要處理的表示式行數,不超過200行。接下來的c行每行包含一個表示式,表示式的形式由上述給出(已轉換為字首形式,無空格,有括號)。最多包含10000個節點。
輸出描述:
對於每個表示式,輸出按說明中優化後的表示式。
示例1:
轉載說明
本文首先發佈於個人部落格上,轉載請注入宣告。