從一道簡單的面試題考查應(yīng)聘者的技術(shù)能力

在日常的招聘中,一個比較頭疼的問題是,如何考察應(yīng)聘者的技術(shù)能力,本文從一個簡單的筆試題的角度,談?wù)勛约翰怀墒斓慕?jīng)驗。

面試觀察中發(fā)現(xiàn),很多開發(fā)同學(xué)平時只注重各種框架、新技術(shù)的學(xué)習(xí),對于基本功不夠重視,然而對于框架的學(xué)習(xí),很多時候也只停留在會用的水平,對于框架的實現(xiàn)原理以及框架能解決哪些問題不是非常清楚。日常的開發(fā)實踐中,很多時候也只是照著現(xiàn)成的代碼拷貝粘貼,然后再修改,最終是可以用的。但如果要從頭開始,搭建一個完整的項目框架,或者寫一些稍微復(fù)雜的代碼,就完全暴露出真實水平了。

問題

下面是筆者在面試中經(jīng)常讓應(yīng)聘者手寫代碼的一個題目。要求如下:

輸入:一個帶轉(zhuǎn)義字符’\b’的字符串

要求:刪除轉(zhuǎn)義字符’\b’和它前面的字符,如果遇到多個連續(xù)的’\b’,則刪除相同數(shù)量的轉(zhuǎn)義字符和前面的字符

輸出:最終的結(jié)果字符串

舉例:輸入"abc\b\bd\b\bghi",期望輸出"ghi"

題目本身比較簡單,主要涉及字符串操作,但和流行的C語言面試題目strcpy類似,可以從很多細節(jié)處考查應(yīng)聘者多方面的能力。

基本功

下面總結(jié)應(yīng)聘者常見的幾類表現(xiàn),來一一說明。

第一類:做不出來

做不出來分兩種情況。

第一種是需求沒有理解清楚。

1.不知道轉(zhuǎn)義字符,認為’\b’是兩個字符,從而把問題復(fù)雜化

2.簡單地用字符串的replace操作替換’\b’字符

這類應(yīng)聘者在你講的時候,可能根本沒有認真聽,放到日常的工作中,可能一件事情要反復(fù)講很多遍,才能達到你想要的結(jié)果。

第二種是真的做不出來,可以給適當(dāng)提示,如果還是完成不了,可能基本功就不過關(guān)。

第二類:基本能實現(xiàn)需求

public String stringReplace1(String str) {

if (StringUtils.isEmpty(str)) {

return StringUtils.EMPTY;

}

int index = str.indexOf('\b');

if (index == -1) {

return str;

}

return stringReplace1(index <= 1 ? str.substring(index + 1)

: str.substring(0, index - 1) + str.substring(index + 1));

}

這是一個典型的遞歸解決辦法,可以看出對于String類的基本操作比較熟悉。從一些細節(jié)上,字符串的判空處理、substring的index處理,都可以看出來應(yīng)聘者比較細心。我會追問效率問題,還有當(dāng)輸入是一個非常大的字符串時會不會有問題,如果應(yīng)聘者能考慮到非遞歸方法和棧溢出的問題,會得到加分。

public String stringReplace2(String str) {

if (StringUtils.isEmpty(str)) {

return StringUtils.EMPTY;

}

int count = 0;

StringBuilder sb = new StringBuilder();

for (int i = 0; i < str.length(); i++) {

if (str.charAt(i) != '\b') {

sb.append(str.charAt(i));

count++;

} else {

if (count > 0) {

sb.deleteCharAt(count - 1);

count--;

}

}

}

return sb.toString();

}

這個實現(xiàn)更讓人滿意一些,實踐中發(fā)現(xiàn)有不少人不知道如何刪除StringBuilder對象中的一個字符,可能大家append()方法用的最多,不知道還有一個deleteCharAt()方法。如果有應(yīng)聘者知道這個方法,或者假設(shè)有這么個方法,可以問問實現(xiàn)原理,效率如何,如果能夠答上來基于數(shù)組實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)的優(yōu)點和缺點,我會相當(dāng)滿意。

第三類:更好的實現(xiàn)

public String stringReplace3(String str) {

if (StringUtils.isEmpty(str)) {

return StringUtils.EMPTY;

}

int dstPos = 0;

char result[] = new char[str.length()];

for (int i = 0; i < str.length(); i++) {

if (str.charAt(i) != '\b') {

result[dstPos++] = str.charAt(i);

} else {

if (dstPos > 0) {

dstPos--;

}

}

}

return String.valueOf(result, 0, dstPos);

}

這是最滿意的一個實現(xiàn),與第二種類似,無非就是把StringBuilder換成了char array,這樣在刪除一個字符的時候只需要移動下標(biāo)即可,性能肯定比用StringBuilder要快不少。

第四類:把問題考慮的太復(fù)雜

有的應(yīng)聘者會把問題考慮的過于復(fù)雜,比如可能會考慮到搜索連續(xù)的非’\b’字符區(qū)域和連續(xù)的’\b’區(qū)域,然后計算需要保留的字符區(qū)域,整塊拷貝,以為這樣可以提高效率。顯然對于這個問題,最終的結(jié)果可能是對的,但是寫起來比較復(fù)雜,面試中極容易因為細節(jié)沒處理好而被面試官指出來。實際上對于這個問題,這種做法的效率并不高。實踐中這類應(yīng)聘者,題目多半會做不出來。

代碼

雖說面試時時間緊張,首要目標(biāo)是完成題目,但很多應(yīng)聘者寫的代碼潦潦草草,根本沒法看,只能邊看邊解釋。也有應(yīng)聘者會寫完第一遍,覺得沒問題后再謄寫一遍,這至少是一個好的習(xí)慣,以體現(xiàn)對面試官的尊重。更好的做法是先理好思路,再一氣呵成。從完成的代碼,至少可以看出代碼的整潔程度和代碼風(fēng)格,俗話說字如其人,放到代碼上也是一樣的道理。

態(tài)度

往往大家認為,筆試對于剛出校門的人是強項,很多工作了好多年的人,對于筆試是極其反感的。筆試分兩種,一種是面試之前,讓你先做做筆試題,考查應(yīng)聘者的技術(shù)基礎(chǔ),大部分都比較簡單,本人對這一類筆試是反感的。首先,很多題目都比較偏門,類似運算符的優(yōu)先級、指出構(gòu)造了幾個對象等等,固然可以測試應(yīng)聘者在很多細節(jié)上的掌握程度,但在實際的開發(fā)過程中,這些細節(jié)又能用到多少呢,特別是對于Java之類高級語言。其次,答題的時間多了,交流的時間相對就少了。

另一類筆試是本人比較喜歡的,面試中除了交流,還可以讓應(yīng)聘者做幾個小題目,或者搞個白板編程也不錯。這類題目一般都不會特別復(fù)雜,如果應(yīng)聘者不是很配合,或者草草了事,我可能會認為這個人的態(tài)度有問題。作為一個軟件工程師,寫代碼是最基礎(chǔ)的能力。如果覺得有不理解的地方,或者有困難,可以和面試官交流,給予適當(dāng)?shù)奶崾?,但首先需要端正態(tài)度。

寫在最后

對于面試中小題目的選擇上,可以稍微靈活點,結(jié)合一些實際中遇到的問題,讓應(yīng)聘者來嘗試解決,簡單的可以寫出代碼實現(xiàn),復(fù)雜的給出解決問題的思路和過程也是好的;不贊成直接用明確的算法題,比如快排、二叉樹遍歷,這類題目目標(biāo)非常明確,只要應(yīng)聘者熟悉這個算法,或者準(zhǔn)備過這個算法,很容易就可以寫出來,無法考查出分析問題和解決問題的能力。

本文只是舉一個簡單的例子,小題目本身可能并不是目標(biāo),通過應(yīng)聘者在解決這些小問題時的表現(xiàn),根據(jù)實際情況作適當(dāng)?shù)难由?,可以考查更深層次的知識,以及應(yīng)聘者解決問題的思路和反應(yīng),也同時可以反應(yīng)出一個人對于工作的態(tài)度。

本文譯者:袁國營(點融黑幫),現(xiàn)任點融資深軟件工程師,負責(zé)資產(chǎn)端的系統(tǒng)架構(gòu)設(shè)計和開發(fā)工作,從頭開始搭建了統(tǒng)一進件和自動審批系統(tǒng)。先后任職于上海貝爾、IBM,在電信、服務(wù)器開發(fā)、互聯(lián)網(wǎng)金融等多個領(lǐng)域工作過。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容