小鐘面經 位元組推薦演算法工程師 2020 12

2021-10-11 21:34:22 字數 3890 閱讀 7180

【演算法】快速排序

【演算法】找出需要排序的部分的首尾索引

【演算法】n個繩子圍成若干個圈

【演算法】陣列劃分的價值

【演算法】字串排序後,根據末尾字母恢復原字串

【過去經歷】位元組資料開發實習中使用者增長方面,目標是什麼,指標是什麼,有什麼結論,結論有什麼應用

入職時間、實習時長、每週出勤情況等;

大小周是否能接受;

轉正意願、職業規劃(專業不契合)等;

上一段實習中的收穫、困難、leader評價等;

有沒有參與過實驗室專案,導師是誰;

給定乙個互不重複的整數陣列,編寫乙個函式,找出索引m和n,只要將索引區間[m,n]的元素排好序,整個陣列就是公升序的。注意:n-m盡量最小,也就是說,找出符合條件的最短序列。函式返回值為[m,n],若不存在這樣的m和n(例如整個陣列是公升序的),請返回[-1,-1]。

示例:

[1, 2, 3, 4, 5] 返回 [-1, -1]

[1, 2, 5, 3, 4] 返回 [2, 4]

[1, 2, 5, 7, 6, 1, 9, 6, 3, 4, 8, 11] 返回 [2, 11]

解法:從頭往後找到第乙個倒序中第乙個元素的索引 i,從後往前找到第乙個倒序對中第二個元素的索引 j,取序列 i 和 j 之間的最大值和最小值,再從 i 往前找到比最小值小的索引,從 j 往後找到比最大值大的索引,返回這兩個值。注意找最大值和最小值的這一步,是一開始沒有想到的。

class

solution

:def

sortindex

(self, lst:

list):

iflen

(lst)

<=1:

return[-

1,-1

]

i, j =0,

len(lst)-1

while i <

len(lst)-1

and lst[i]

<= lst[i+1]

: i +=

1if i ==

len(lst)-1

:return[-

1,-1

]while j >

0and lst[j]

>= lst[j-1]

: j -=

1

left_margin, right_margin =

min(lst[i:

(j+1)]

),max(lst[i:

[j+1]]

)while i >=

0and lst[i]

> left_margin:

i -=

1while j <=

len(lst)-1

and lst[j]

< right_margin:

j +=

1return

[i+1

, j-

1]

n根繩子,每根顏色互不相同,每根繩子的兩端也互不相同。要將其中的某些繩子連線成若干個圈(一根繩子自己首尾相連也視為乙個圈),問有多少種不同的方法。

解法:遞迴的方法,n個繩子和n-1個繩子相比,第n個繩子可以自己圍成乙個圈,也可以分別用第n個繩子的頭部、尾部和n-1跟繩子中的每個繩子的尾部相連,視作一根繩子。注意是可以圍成若干個圈,而不只是圍成乙個圈。

給定包含n個元素的陣列,將其分割為m段,對每一段的和取最大值,即為這種劃分的價值。求一種劃分,使得對這個陣列而言,這種劃分的價值最小。

示例:陣列[5, 1, 4, 2, 3],可以劃分為 5 | 1 4 | 2 3,各段和分別為 5 5 5,這種劃分的價值為5,也可以劃分為 5 1 | 4 2 | 3,各段和分別為 6 6 3,這種劃分的價值為6,對這個陣列,劃分的價值最小即為5。

解法:動態規劃,fij

f_fi

j​表示對長度為 i 的陣列a做 j 次劃分的價值,則對長度為 i 的陣列做 j 次劃分可以視為將每次將最後乙個元素自己作為一段、和前面乙個元素作為一段、和前面兩個元素作為一段……前面剩下的元素們做 j-1 次劃分,即價值為將前 p 個元素做 j-1 次劃分的價值和p+1到n的元素求和取大,再對所有的p取最小。

f ij

=min

p∈[j

,i−1

]}

f_ = min_\,\sum_^ia_k\}\}

fij​=m

inp∈

[j,i

−1]​

}其它想法:給定乙個數p,問是否存在一種劃分,使得這個劃分的價值不超過p。基於貪心演算法,每次找最長的和不超過p的序列,看劃分m次後是否用完序列中的所有元素。需證明貪心演算法是有效的,即任意一種不能被貪心演算法找出的劃分都不符合題意,證明思路為基於貪心的劃分,其中每一段往後多納入乙個元素,這段的和都會超過p,往前多納入乙個元素也許不會超過p,但是最後剩下的那些元素還是沒有被塞入任何一段中,減少乙個或多個元素,也會導致更多的未被塞入任何一段的元素,因此貪心演算法是有效的。

基於以上提示,提出了以下想法,但都行不通:

給定乙個n個字串的序列,如n=4時,給定序列acbd,每次可以把這個序列最開頭的元素挪到末尾,得到

acbd

cbda

bdac

dacb

對這四個序列排序,得到

acbd

bdac

cbda

dacb

如果僅給定排序後序列的最後一位的字母,即dcab,能否還原出原序列(acbd、cbda、bdac、dacb均可)

解法:首先容易想到,對末尾字母排序,即為對應的n個序列的開頭,即有

axxd

bxxc

cxxa

dxxb

即原序列中,d後面是a,c後面是b,a後面是c,b後面是d,找到長度為2的子串,對沒有重複字元的字串,到此處即可恢復。

對有重複字元的字串,如ababcc,這種方法行不通,進一步思路為找到長度為2的子串後,依次找到長度為3的子串、長度為4的子串,直到找到長度為n的子串,即恢復。具體來講,每次找到長度為2的子串後,將末尾字元恢復到前面,再對字串做排序 ,排序後新的這些子串的末位字母就是題目給出的最後一位的字母,以此類推,直至獲取長度為n的子串。

class

solution

:def

strsort

(self, lst)

: lst_temp, i = lst,

1while i <

len(lst)

: lst_sort = lst_temp[:]

lst_sort.sort(

) lst_temp =

[lst[j]

+lst_sort[j]

for j in

range

(len

(lst))]

i +=

1 lst_temp.sort(

)print

(lst_temp[0]

)return lst_temp[0]

sl = solution(

)sl.strsort(

['c'

,'b'

,'a'

,'a'

,'c'

,'b'

])

位元組跳動 推薦演算法工程師面經

作者是研二的學弟,和號主一樣都為非科班,但是實力不容小覷,頂住壓力早早地在提前批收割了大廠的offer,可以說是 神仙學弟 了,方向為機器學習 資料探勘 nlp,同時也對推薦系統具有強烈的興趣,如下僅為部分面經,牆裂歡迎各網際網路大佬來撩!7.2更新,晚上7點終於收到了意向書,不用再反覆刷郵箱了 6...

位元組跳動 測試開發工程師 面經

自我介紹 作業系統 虛擬記憶體的概念 程序和執行緒 執行緒同步 如何實現執行緒同步 計算機網路 說一下tcp 為什麼是四次揮手呢 說乙個ip位址,如果第一位元組是269行不行 說一下http 自己講了get post 自己在專案中用過這些方法嗎 在頁面上點讚用了哪些方法 是不是有乙個功能是get和p...

華為面經(機器視覺演算法工程師)

一面是技術面,面試官是根據你簡歷上的東西來問的,問專案,問的很細。建議 要對簡歷上的東西了解的非常透徹 簡歷上要體現你的工作量,體現你做了哪些東西 要有和崗位要求匹配的專案,如果沒有,建議自己根據崗位要求做一兩個作品 你要對你這個領域的最新成果,突破有所了解 你要對你這個領域的最新應用有所了解,以及...