最近去了幾家公司面試,有一些大公司(比如企鵝)的考核內容真心弱智,考的都是些演算法,尼瑪,拿一個剛畢業的學生來做說不定也可以過的,看來本來就不是在招搞伺服器的,舉個例子,企鵝多個部門都曾出的一道題:如何知道集合A,B中的相關性。
意思就是哪些元素在A,B之中都有,哪些元素在A,B中不都出現。
其實解法很簡單,學過演算法的完全可以做到 。我們知道集合具有互異性,就是集合中的元素只能出現一次,可以建一個map< key, value >,是標準庫的還是自建一個紅/黑樹狀結構都無所謂,
將A,B集合中的元素當成key,各自遍曆一次,插入map中,每次插入 value自增一次,最後再遍曆一次map,所有 value = 2的key是A,B共有的,value=1的key是A,B相異的。
如果A,B中的元素是整數,而且很小,問題則退化成類似計數排序,解法如下:
A{ 2,4,6,10,7,25 } B{ 3,9,4,2,19,25 }
#define MAX_NUMint test( int A[], int a_len, int B[], int b_len ){int size, i, max, tp_key;int *tmp;if( !a_len || !b_len ){return -1;}size = MAX_NUM * sizeof( int );tmp = malloc( size );if( !tmp ){return -1;}memset( tmp, 0, size );max = 0;for( i = 0; i < a_len; ++i ){tp_key = A[i];max = tp_key > max ? tp_key : max;tmp[ tp_key ]++;}for( i = 0; i < b_len; ++i ){tp_key = B[i];max = tp_key > max ? tp_key : max;tmp[ tp_key ] ++;}++max;for( i = 0; i < max; ++i ){if( !tmp[ i ] )continue;if( 1 == tmp[ i ] ){printf( "%d is in A or B\n", i );}else{printf( "%d is in A and B\n", i );}}free( tmp );return 0;}
言歸正傳,其實演算法應該是大家的基本功,考核演算法應該也沒有錯,但既然招的是伺服器架構開發,我想考核更多的是實戰經驗。
有一家中等公司的面試題不錯,此系列博文將圍繞它展開研究。
原題:時間同步系統開發需求
需求情境:用戶端向伺服器發起登入請求,鑒權通過後(為了簡化工作,所有登入請求,只要請求參數裡的使用者名稱和密碼不為空白,都鑒權通過),用戶端再向伺服器請求當前系統時間,伺服器返回當前系統時間後關閉串連。
要求:
1、傳輸層使用TCP協議,應用程式層協議不限。
2、可支援同時線上使用者量:大於 2W。
3、並發效能:沒有明確指標。
4、伺服器端運行環境:linux 2.4以上核心版本;開發語言:C++/C。
5、用戶端運行環境:不限;開發語言:不限。(可以很簡單,不要求介面)
6、要求有類比效能測試操作方法,如多用戶端、多線程類比同時請求等。
7、用真實代碼。
8、不要求日誌系統,但是要考慮在主線程列印螢幕引起的效能問題。
我就覺得要是哪個公司面試的時候能出得出這樣的題目,那就應該很專業了,對面試的人也就可以算得上挑戰了。
tcp 服務端-用戶端通訊的程式,網上一搜一大堆,大家可能都會寫,但是並發量和容錯性不一定能上得去,2W的並發量不是蓋出來的,如果這道題目能夠搞定,基本上伺服器這塊應該是難不倒了。
下面說說我應該怎麼做:
首先是建立前後端的通訊協定:
request:
username/password, 約定username與password 各佔32個位元組(聯同末位0)
response:
time_t 格式
由於通訊內容簡單,選擇二進位傳輸,而不選擇http,當然如果要考考 http 協議的瞭解,那就另當別論了。
請回頭對題目認真看看,或者自己也可以寫寫,這裡沒有放代碼,是因為我打算連載,請關注啦。
下篇我給大家寫用戶端程式先。