2019位元組跳動春招題目

2021-09-29 17:19:51 字數 3334 閱讀 9811

2019位元組跳動演算法崗春招(不是2020屆的秋招!),共四道程式設計題,沒有選擇題。筆試的時候只做出來了前兩道,這裡參考了大佬 azhao1993 的解題思路, 把後兩道的解法整理一下。

現在有n人參加程式設計比賽,比賽結束後每個人都得到乙個分數。現在所有人鋪成一圈(第1個和第n個相鄰)領取獎品,要求:

1.如果某個人的分數比左右的人高,那麼獎品數量也要比左右的人多;

2.每個人至少得到乙個獎品。

輸入描述:

第一行是整數n,表示測試樣例數

每個測試樣例的第一行是乙個正整數,表示參加比賽的人數(0示例1

輸入

2

21 2

41 2 3 3

輸出

3

8

思路: 將選手從左到右排列在乙個列表中,首尾相連,然後從左到右和從右到左分別使用貪心演算法。

解答(python3):

# 讀入輸出

import sys

try:

while

true

: line = sys.stdin.readline(

).strip(

)if line =='':

break

except

:pass

defmain()

: n =

int(lines[0]

)# 測試樣例數

for i in

range

(n):

m =int(lines[i*n+1]

)#選手數目

s =[int

(item)

for item in lines[i*n+2]

.split(

' ')

]# 選手的分數

assert m ==

len(s)

,print

("error!"

) r =[1

for _ in

range

(m)]

# 選手的獎品數,初始值為每個選手1個獎品

# 首尾相連

m +=10

])1)

while

true

: flag =

false

#判斷當前迴圈內有沒有發生獎品數的變化,若沒有則說明當前獎品數已滿足要求,可以退出當前迴圈。

#從左到右,若右邊選手的分數高於左邊,但獎品數低於或等於左邊,則右邊選手的獎品數=左邊選手的獎品數+1

for j in

range

(m-1):

if s[j]

< s[j+1]

and r[j]

>= r[j+1]

: r[j+1]

= r[j]+1

flag =

true

r[0]

= r[-1

]#從右到左,若左邊選手的分數高於右邊,但獎品數低於或等於右邊,則左邊選手的獎品數=右邊選手的獎品數+1

for j in

range

(m-1,1

,-1)

:if s[j]

< s[j-1]

and r[j]

>= r[j-1]

: r[j-1]

= r[j]+1

flag =

true

r[-1

]= r[0]

ifnot flag:

break

result =

sum(r[0:

len(s)-1

])#輸出結果

print

(result)

if __name__ ==

'__main__'

: main(

)

有n根繩子,第i根子長度為li,現在需要m根等長的繩子,你可以對n根繩子進行任意裁剪(不能拼接),請你幫忙計算出這m根繩子最長的長度是多少。

輸入描述:

第一行包含2個正整數n,m, 表示n根原始的繩子和最終需要m根繩子數

第二行包含n個整數,第i個整數li表示第i根繩子的長度

其中1<=n, m<=10000

0輸出描述:

對每乙個測試用例,輸出乙個數字,表示裁剪最後的長度,保留兩位小數

思路:二分法

解答(python3):

# 讀入輸出

import sys

try:

while

true

: line = sys.stdin.readline(

).strip(

)if line =='':

break

except

:pass

n = lines[0]

.split(

' ')[0

]m = lines[0]

.split(

' ')[1

]l =

[int

(item)

for item in lines[1]

.split(

' ')

]def

main()

: length =

sum(l)

#總繩長

l =0 r = length

result =

0while

(r-l)

>1e-

4:#二分法,當l-r滿足精度時跳出迴圈

mid =

(l+r)

/2.0

if mid ==0:

break

ifsum([

int(item/mid)

for item in l]

)>= m:

#如果可以截成m段長度為mid的繩子

l = mid

result = mid

else

: r = mid

print

(round

(mid,2)

)if __name__ ==

'__main__'

: main(

)

2019位元組跳動秋招筆試

題目描述 小明目前在做乙份畢業旅行的規劃。打算從北京出發,分別去若干個城市,然後再回到北京,每個城市之間均乘坐高鐵,且每個城市只去一次。由於經費有限,希望能夠通過合理的路線安排盡可能的省一些路上的花銷。給定一組城市和每對城市之間的火車票的價錢,找到每個城市只訪問一次並返回起點的最小車費花銷。輸入描述...

2019位元組跳動實習面試

位元組跳動還是依舊非常注重演算法能力,所以面試過程演算法比重依舊比較大,不知道是不是年前比較缺人的原因,這次面試一共經歷了兩面,而且難度比我去年面試抖音略簡單一下,下面是面試過程的主要題目。1.開始仍舊是常規的自我介紹,接下來重點詢問我在美團實習的經歷,待我將實習內容講解完成以後,主要問我分庫分表按...

2019春招筆試涼經 位元組跳動20190316

1.求找錢最少給幾個硬幣 有1024元錢 輸入你花掉的數目問找回的硬幣數最小 有64 16 4 1 的硬幣 res 1024 n cnt 0 while res 64 res 64 cnt 1 while res 16 res 16 cnt 1 while res 4 res 4 cnt 1 whi...