字节跳动2019春招第二次笔试编程题
字節(jié)跳動(dòng)2019春招第二次筆試編程題
- 1.變身程序員
- 題目描述
- 輸入描述
- 輸出描述
- 示例
- 示例1
- 示例2
- 示例3
- 分析
- 參考代碼
- 2.特征提取
- 題目描述
- 輸入描述
- 輸出描述
- 示例
- 示例1
- 備注
- 分析
- 參考代碼
- 3.機(jī)器人跳躍問(wèn)題
- 題目描述
- 輸入描述
- 輸出描述
- 示例
- 示例1
- 示例2
- 示例3
- 備注
- 分析
- 參考代碼
- 4.畢業(yè)旅行問(wèn)題
- 題目描述
- 輸入描述
- 輸出描述
- 示例
- 示例1
- 分析
- 參考代碼
- 4.過(guò)河問(wèn)題
- 題目描述
- 輸入描述
- 輸出描述
- 示例
- 示例1
- 分析
- 參考代碼
個(gè)人主頁(yè):http://redtongue.cn or https://redtongue.github.io/
1.變身程序員
題目描述
公司的程序員不夠用了,決定把產(chǎn)品經(jīng)理都轉(zhuǎn)變?yōu)槌绦騿T以解決開(kāi)發(fā)時(shí)間長(zhǎng)的問(wèn)題。
在給定的矩形網(wǎng)格中,每個(gè)單元格都可以用以下三個(gè)值之一:
-
值0代表空單元格
-
值1代表產(chǎn)品經(jīng)理
-
值2代表程序員
每分鐘,任何與程序員(在四個(gè)正方向上)相鄰的產(chǎn)品經(jīng)理都會(huì)變成程序員。
返回知道單元格中沒(méi)有產(chǎn)品經(jīng)理為止所必須經(jīng)過(guò)的最小分鐘數(shù)。
如果沒(méi)有可能,返回-1.
輸入描述
不固定多行(行數(shù)<=10),每行是按照空格分割的數(shù)字(不固定,每行數(shù)字個(gè)數(shù)<=10) 其中每個(gè)數(shù)組項(xiàng)的取值僅為0,1,2三種 (讀取時(shí)可以按行讀取,知道讀取到空行為止,再對(duì)讀取的所有行做轉(zhuǎn)換處理)輸出描述
如果能夠?qū)⑺械漠a(chǎn)品經(jīng)理變?yōu)槌绦騿T,則輸出最小的分鐘數(shù) 如果不能夠?qū)⑺械漠a(chǎn)品經(jīng)理變?yōu)槌绦騿T,則返回-1示例
示例1
輸入: 0 2 1 0 輸出: -1示例2
輸入: 1 2 1 1 1 0 0 1 1 輸出: 3示例3
輸入: 1 2 2 1 1 2 0 1 0 1 1 1 輸出: 4分析
- 深度優(yōu)先搜索,區(qū)別在每一次(每分鐘)只會(huì)將程序員周圍的產(chǎn)品經(jīng)理變?yōu)槌绦騿T,不會(huì)迭代下去
- manage記錄產(chǎn)品經(jīng)理的個(gè)數(shù),若每一個(gè)傳播之后,manage不再變化,停止;
- 若manage=0返回傳播時(shí)間,反之返回-1。
參考代碼
import sys if __name__ == "__main__":def get(A):s=0for a in A:for x in a:if(x==1):s+=1return slines = sys.stdin.readlines()a=[]for line in lines:a.append(list(map(int,line.split())))s=0print("a",a)manage=get(a)row=len(a)col=len(a[0])def dfs(x,y):if(x-1>=0 and a[x-1][y]==1):a[x-1][y]=2if(x+1<row and a[x+1][y]==1):a[x+1][y]=2if(y-1>=0 and a[x][y-1]==1):a[x][y-1]=2if(y+1<col and a[x][y+1]==1):a[x][y+1]=2returnwhile(manage>0):li=[]for i in range(row):for j in range(col):if(a[i][j]==2):li.append((i,j))for l in li:dfs(l[0],l[1])nmanage=get(a)print(a)s+=1if(manage==nmanage):breakmanage=nmanageif(manage==0):print(s)else:print('-1')2.特征提取
題目描述
小明是一個(gè)算法工程師,同時(shí)也是一名鏟屎官。某天,他突發(fā)奇想,想從貓咪的視頻里挖掘一些貓咪的運(yùn)動(dòng)信息。為了提取運(yùn)動(dòng)信息,他需要從視頻的每一幀提取“貓咪特征”。一個(gè)貓咪特征是一個(gè)兩維的vector<x,y>。如果x_1=x_2 and y_1=y_2,那么這倆是同一個(gè)特征。
因此,如果貓咪特征連續(xù)一致,可以認(rèn)為貓咪在運(yùn)動(dòng)。也就是說(shuō),如果特征<a,b>在持續(xù)幀里出現(xiàn),那么它將構(gòu)成特征運(yùn)動(dòng)。比如,特征<a,b>在第2/3/4/7/8幀出現(xiàn),那么該特征形成兩個(gè)特征運(yùn)動(dòng)2-3-4和7-8.
輸入描述
第一行包含一個(gè)正整數(shù)N,代表測(cè)試用例的個(gè)數(shù) 每個(gè)測(cè)試用例的第一行包含一個(gè)正整數(shù)M,代表視頻的幀數(shù) 接下來(lái)M行,每一行代表一幀,其中,第一個(gè)數(shù)字是該幀的特征個(gè)數(shù),接下來(lái)的數(shù)字是在特征的取值:比如樣例輸入第三行里,2表示該幀有兩個(gè)貓咪特征,<1,1>和<2,2>。所有用例的輸入特征總數(shù)和<=100000 N滿足1<=N<=100000,M滿足1<=M<=100000,一幀的特征個(gè)數(shù)滿足<=100000.特征取值均為非負(fù)整數(shù)輸出描述
對(duì)于每一個(gè)測(cè)試用例,輸出特征運(yùn)動(dòng)的長(zhǎng)度作為一行示例
示例1
輸入: 1 8 2 1 1 2 2 2 1 1 1 4 2 1 1 2 2 2 2 2 1 4 0 0 1 1 1 1 1 1 輸出: 3備注
如果沒(méi)有長(zhǎng)度大于2的特征運(yùn)動(dòng),返回1
分析
- 用字典存儲(chǔ)每個(gè)特征出現(xiàn)的次數(shù),ans記錄特征出現(xiàn)的最大次數(shù),初始為0
- 遍歷每一幀的特征,若字典中存在該特征,則次數(shù)加一,反正說(shuō)明該特征斷了,次數(shù)置為1,更新ans
- 返回ans
參考代碼
if __name__ == "__main__":N=int(input())for n in range(N):M=int(input())d={}ans=1for m in range(M):li=list(map(int,input().split()))s=li[0]newd={}for i in range(s):ind=(li[i*2+1],li[i*2+2])if(ind in d):newd[ind]=d[ind]+1else:newd[ind]=+1for nd in newd:ans=max(ans,newd[nd])d=newdprint(ans)3.機(jī)器人跳躍問(wèn)題
題目描述
機(jī)器人正在玩一個(gè)古老的基于DOS的游戲。游戲中有N+1座建筑----從0到N編號(hào),從左到右排列。編號(hào)為0的建筑高度為0個(gè)單位,編號(hào)為i的建筑的高度為H(i)個(gè)單位。
起初,機(jī)器人在編號(hào)為0的建筑處。每一步,它跳到下一個(gè)(右邊)建筑。假設(shè)機(jī)器人在第k個(gè)建筑,且它現(xiàn)在的能量值是E,下一步它將跳到第k+1建筑。他將會(huì)得到或者失去正比于H(K+1)和E之差的能量。如果H(k+1)>E那么機(jī)器人就失去H(K+1)-E的能量值,反之它將得到E-H(K+1)的能量值
游戲目標(biāo)是到達(dá)第N個(gè)建筑,在這個(gè)過(guò)程中,能量值不能為負(fù)。現(xiàn)在的問(wèn)題是機(jī)器人以多少能量值開(kāi)始游戲,才可以保證完成游戲
輸入描述
第一行輸入,表示一共有N組數(shù)據(jù) 第二個(gè)是N個(gè)空格分割的整數(shù),H1,H2,H3,...,Hn代表建筑的高度輸出描述
輸出一個(gè)單獨(dú)的數(shù)表示完成游戲所需的最小單位的初始能量示例
示例1
輸入: 5 3 4 3 2 4 輸出: 4示例2
輸入: 3 4 4 4 輸出: 4示例3
輸入: 3 1 6 4 輸出: 3備注
數(shù)據(jù)約束:
1<=N<=10^5
1<=H(i)<=10^5
分析
- 用二分查找來(lái)找到最小能量值,start=0,end=max(H),高度小于能量值時(shí),能量只增不減,座椅最大值為max(H);
- 遍歷建筑物,更新E值,若中間E小于0,則更新start=mid+1;
- 反之end=mid;
- 最后返回end。
參考代碼
if __name__ == "__main__":N=int(input())H=list(map(int,input().split()))start=0end=max(H)while(start<end):mid=(start+end)//2E=midjudge=Truefor h in H:if(E < h):E-=(h-E)else:E+=(E-h)if(E < 0):start=mid+1judge=Falsebreakif(judge):end=midprint(end)4.畢業(yè)旅行問(wèn)題
題目描述
小明目前在做一份畢業(yè)旅行的規(guī)劃。打算從北京出發(fā),分別去若干個(gè)城市,然后再回到北京,每個(gè)城市之間均乘坐高鐵,且每個(gè)城市只去以此。由于經(jīng)費(fèi)有限,希望能夠通過(guò)合理的路線安排盡可能的省一些路上的開(kāi)銷。給定一組城市和每對(duì)城市之間的火車票的價(jià)錢,找到每個(gè)城市只訪問(wèn)一次并返回起點(diǎn)的最小花銷。
輸入描述
城市個(gè)數(shù)n(1<=n<=20,包括北京) 城市間的車票價(jià)錢,n行n列的矩陣m[n][n]輸出描述
最小花銷s示例
示例1
輸入: 4 0 2 6 5 2 0 4 4 6 4 0 2 5 4 2 0 輸出: 13 說(shuō)明: 共四個(gè)城市,城市1與城市1的車費(fèi)是0,城市1和城市2的車費(fèi)是2,以此類推,無(wú)需考慮極端情況。分析
-
遍歷所有城市,得到每個(gè)狀態(tài)下的最小車費(fèi),s是車費(fèi),past記錄已遍歷的城市包含的車票,形如<a,b>是指從a城市到b城市,初始為{(0,0)},只包含一個(gè)城市,車費(fèi)為0;
-
遍歷,新增加一個(gè)城市i,遍歷所有的車票<a,b>,使得<i,a>+<i,b>-<a,b>最小,即遍歷當(dāng)前城市最小的花費(fèi);
-
更新past和s;
-
遍歷完,返回s。
參考代碼
if __name__ == "__main__":n=int(input())m=[]for i in range(n):m.append(list(map(int,input().split())))s=0past=set()past.add((0,0))for i in range(1,n):a,b=0,0cost=m[i][a]+m[i][b]for p in past:c=m[p[0]][i]+m[p[1]][i]-m[p[0]][p[1]]if(c < cost):a=p[0]b=p[1]cost=cs+=costpast.remove((a,b))past.add((a,i))past.add((i,a))print(s)4.過(guò)河問(wèn)題
題目描述
將所有人送到河對(duì)面,每次只能做2或3個(gè)人,且時(shí)間是船上人過(guò)河時(shí)間的最大值。
輸入描述
第一行是整數(shù)m,表示測(cè)試樣例格式 每個(gè)測(cè)試樣例的第一行是一個(gè)正整數(shù)n,表示參加過(guò)河的人數(shù);(2<=n<100000) 第二行是n個(gè)正整數(shù)a[i](0<a[i]<100000),表示n個(gè)人的單獨(dú)過(guò)河時(shí)間輸出描述
每個(gè)測(cè)試樣例,輸出應(yīng)該準(zhǔn)備的最少過(guò)河時(shí)間。示例
示例1
輸入: 2 2 1 2 4 1 1 1 1 輸出: 2 3分析
-
用貪心算法來(lái)解,分為五種情況,time記錄耗時(shí):
-
1人數(shù)大于等于7時(shí),按耗時(shí)排序得(a,b,c,d,***,m3,m2,m1),先將最耗時(shí)的三人送過(guò)去,三個(gè)同時(shí)過(guò)去耗時(shí)(2d+c+b+m1),先送過(guò)去兩個(gè),再送過(guò)去一個(gè),耗時(shí)(2c+2b+m1+m3),逐個(gè)送過(guò)去,耗時(shí)(3b+m1+m2+m3),耗時(shí)為三種情況的最小值;
-
2人數(shù)大于等于6時(shí),按耗時(shí)排序得(a,b,c,***,m3,m2,m1),先將最耗時(shí)的三人送過(guò)去,三個(gè)同時(shí)過(guò)去耗時(shí)(2m3+c+b+m1),先送過(guò)去兩個(gè),再送過(guò)去一個(gè),耗時(shí)(2c+2b+m1+m3),逐個(gè)送過(guò)去,耗時(shí)(3b+m1+m2+m3),耗時(shí)為三種情況的最小值;
-
3人數(shù)等于五個(gè)人時(shí),按耗時(shí)排序得(a,b,c,d,e),最大兩個(gè)先過(guò)去后面三個(gè)再過(guò)去,耗時(shí)(e+3c+b),逐個(gè)過(guò)去,耗時(shí)(e+d+c+2b);
-
4人數(shù)等于四個(gè)人時(shí),按耗時(shí)排序得(a,b,c,d),耗時(shí)(b+c+d);
-
5人數(shù)等與三或二個(gè)人時(shí),耗時(shí)最大耗時(shí)值;
-
返回time。
參考代碼
if __name__ == "__main__":N=int(input())for i in range(N):n=int(input())a=list(map(int,input().split()))a.sort()time=0start=0end=n-1while(end-start+1>=7):p1=a[end]+a[start+1]*2+a[start+2]+a[start+3]*2#過(guò)兩個(gè)小的,再將三個(gè)最大的一起過(guò)去p2=a[end]+a[end-2]+a[start+1]*2+a[start+2]*2#過(guò)一個(gè)小的,將兩個(gè)最大的過(guò)去,再過(guò)去一個(gè)大的p3=a[end]+a[end-1]+a[end-2]+a[start+1]*3#逐個(gè)過(guò)最大的time+=min(p1,p2,p3)end-=3while(end-start+1>=6):p1=a[end]+a[start+1]*2+a[start+2]+a[start+3]*2p2=a[end]+a[end-2]+a[start+1]*2+a[start+2]*2p3=a[end]+a[end-1]+a[end-2]+a[start+1]*3time+=min(p1,p2,p3)end-=3if(end-start+1==5):p4=a[end]+a[start+1]+a[start+2]*3p5=a[start+1]*2+a[start+2]+a[start+3]+a[start+4]time+=min(p4,p5)end=-1if(end-start+1==4):time+=sum(a[start+1:end+1])end=-1if(end-start+1>=2):time+=max(a[start:end+1])print(time)總結(jié)
以上是生活随笔為你收集整理的字节跳动2019春招第二次笔试编程题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何将embed嵌入式Flash网页播放
- 下一篇: 深圳高层次人才认定,你了解吗?