【求職】字節跳動2019校招機器學習算法工程師面試


面試問題總結。

 

問題:
1. 自我介紹。
2. 介紹了一下自己簡歷上的項目。
3. SVM詳細原理。
4. Kmeans原理,何時停止迭代。

算法題:
1. 一個隨機整數產生器產生[1,5],如何設計一個產生[1,7]的隨機整數產生器。
解法:設k1,k2屬於[1,5], 生成k3 = 5*(k1-1)+k2+1, 則k3屬於[1,25], 將k3分成兩個部分,[1,21]和[22,25]. 判斷,若屬於[1,21], 則令op=k3%7+1,op屬於[1,7], 否則丟棄。

2. 給定一個旋轉的有序數組,比如{7,8,9,10,1,2,3}是{1,2,3,7,8,9,10}旋轉之后得到的,在數組中查找是否存在元素key。要求時間復雜度為O(lgn)。假定數組中不存在重復元素。

解法:摘自 https://blog.csdn.net/fjqcyq2/article/details/48879861 
每次根據L和R求出M后,M左邊[L, M]和右邊[M+1, R]這兩部分中至少一個是有序的。 
arr[M]和X比較 
(1). arr[M]==X,返回M 
(2). arr[M] < arr[R],說明右側有序,當 arr[M]< X< arr[R],則L=M+1 , 否則R=M-1 
(3). arr[M] > arr[L],說明左側有序,當 arr[L]< X< arr[M],則R=M-1,否則L=M+1 
簡單代碼: 
int CirculateBSearch(const int* arr,int N,int x) 

int L=0,R=N-1,M; 
while(L <= R) 

M = (L+R)>>1; 
if(arr[M] == x) return M; 
if(arr[M] <= arr[R])//arr[M]右側是有序的 

if(arr[M]< x && x<=arr[R])//x在有序部分的內部 
L = M+1; 
else R = M-1; 

else//arr[M]左側是有序的 

if(x< arr[M] && arr[L]<=x)//x在有序部分的內部 
R = M-1; 
else L = M+1; 


return -1; 

簡單測試: 
const int N = 12; 
int X = 5; 
int arr[N] = {15,16,19,20,25,1,3,4,5,7,10,14}; 
cout<<”Array : “; 
PrintArray(arr,N); 
int index = CirculateBSearch(arr,N,X); 
if(index < 0) cout<< X<<” is not found in arr.\n”; 
else cout<< X<<” is found in arr, index = ” << index << endl;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM