- 相關(guān)推薦
筆試題目及難題解決方案筆試經(jīng)驗
1. 毫無疑問,面試得從筆試開始,先在筆試的時候讀代碼寫結(jié)果,還是很簡單的一道題,不過就是考C#繼承,構(gòu)造函數(shù),及new對基類的隱藏等基礎(chǔ)知識,換做誰應(yīng)該都能做出來。
2. 接下來的筆試問答題也還算簡單,也不過就是諸如裝箱拆箱,類和結(jié)構(gòu)的區(qū)別,GAC,CLR等等基礎(chǔ)得讓人崩潰的基礎(chǔ),說崩潰,是因為它們都是剛畢業(yè)那年為了找工作曾試著死記硬背的概念,其實接觸得多了,就算撇開概念也能較為清晰地描述它們,只是可能名詞稱呼不夠?qū)I(yè)。
3. 緊接著就是編碼題,常見的編碼題就是排序,這次也毫無意外,寫了一個比堆排序容易超級多的快速排序,寫完心里還蠻忐忑的,雖然腦袋里嘗試運行的時候結(jié)果好像是對的,然而總覺得哪里有問題,問題不是出在實現(xiàn)上,而是那一瞬間,突然不知道自己寫出來的是不是快排了,只能肯定不是冒泡,冒泡可沒那么長的代碼。這里需要注意一點:如果能寫泛型代碼盡量寫泛型,一個原因是泛型的作用還是很明顯的,還有,寫成泛型,稍稍好像有提升自己的檔次吧。當(dāng)然,如果寫成 int[] array,回頭面試官八成還得問你,那我要是傳入的是一個string[] array(這個可能性會相對小)或者byte[] array,long[] array怎么辦?
面試的時候,他肯定了我寫的是正確的快排,還提醒我,所有排序里面只有快排是用到了遞歸,所以只要你寫出了遞歸,就可以肯定是快排。雖然自己沒有一一去驗證,不過就我所知道的為數(shù)不多的排序算法里,仔細(xì)想想,好像確實只有快排用到了遞歸。面試官還專門寫了幾個數(shù)字,問快排第一趟排序結(jié)束后的排序是什么樣的,大概是怕我死記硬背這段代碼,而不知道具體的邏輯吧。我稍微用筆畫了一會,然后回答出來了,或許是為了驗證我確實懂排序,又拿著同樣的數(shù)列,讓我用冒泡方式寫出第一次排序結(jié)束后的情況。還算ok,排序和查找的算法,以前還是理解得比較深刻的,當(dāng)然,只限于簡單的部分,要是問我諸如堆排序什么的,我就只能舉雙手投降了。堆排序以前也仔細(xì)研究過,不過好像跟樹有關(guān),結(jié)果是將這些算法邏輯都還給書本和老師了。
4. 依然還是編碼題,丫丫的,有你這么考我的么?我是應(yīng)聘測試開發(fā)類崗位的自動化測試工作,測試開發(fā),什么叫測試開發(fā),開發(fā)是為了更好的測試,我又不是真的應(yīng)聘開發(fā),尼瑪以為我對C#是有多熟悉,多了解吖??居然讓我實現(xiàn)String.Replace()方法,還不能調(diào)用API,說真的,給我一個用例讓我調(diào)用 Replace方法做字符串的替換,我都可能不知道Replace有幾種重載方法,以及每一個重載方法的參數(shù)有哪些,可是題目放在那里,總不能不會實現(xiàn)也沒有任何思路吧?偛荒艽蜷_手機上網(wǎng)百度吧,手機流量也不多了,舍不得用。為了留下良好印象,也總不能直接寫上“我不會”三個字吧。
栽了栽了,就栽在這題上了,心里沒有任何慌張,只是很冷靜地面對這樣的事實,也許是過分的冷靜吧,腦子里突然有點意識到了什么,如果記憶沒有騙我的話,這個題,早在三四年前,某人曾經(jīng)跟我一起討論過,只是那時候我編碼一塌糊涂,也無心學(xué)習(xí),對于這種算法,編程什么的對話,我頂多當(dāng)他自言自語,理解不了,或者說懶得去理解。
閉上眼睛,努力搜尋那一幕幕微小的記憶片段,究竟那時候他自言自語說的是什么,印象中是他曾在某公司面試C#開發(fā)崗位的時候碰到過的, 也是現(xiàn)場沒有回答出來而回到家里繼續(xù)研究來著,當(dāng)時他究竟研究出了什么結(jié)果。不記得眼睛閉了多久,也不記得腦子里飄過了多少東西,卻很清晰地,抓住了,就是它,沒錯,三四年前,他說過,用CopyTo的方法,只要匹配到輸入的string中需要被替換的字符串及知曉原字串長度,就可以知道 需要被復(fù)制的長度 = 索引-需要被替換的字符串的長度(這僅限當(dāng)時的想法,和具體實現(xiàn)的代碼邏輯對有出入),而一旦找到了這個關(guān)系,用CopyTo的方法將原來的字符串替換成需要被替換的字符串,即使用xx.CopyTo (int sourceIndex, char[] destination, int destinationIndex, int count)(不要問我為什么Replace的重載方法及參數(shù)記不住,CopyTo卻記得那么清楚,前幾天剛幫某個群的某個朋友看一段代碼的時候,剛好里面有CopyTo方法,出于對它的好奇,還特地搜索過,因為時間不長,所以記憶深刻,沒辦法,我記憶力比較好~),可是,然后呢?char[]的數(shù)組是什么?又問了自己幾個問題,腦子里思路似乎是漸漸清晰起來了,不過似乎挺凌亂,所以真讓我從頭到尾實現(xiàn)這個方法,與其說給我多少時間能解決,更可能的情況是,我根本寫不出來,不得不說,似乎蠻復(fù)雜的。算了,還是放棄吧。(代碼實現(xiàn)其實也不難,只是本人不得不承認(rèn),編碼能力有限,沒能現(xiàn)場搞定,代碼在文章結(jié)尾已附上)
5. 緊接著的題也讓我有想放棄的想法,因為這題是根據(jù)寫出的String.Replace()方法進(jìn)行測試用例的設(shè)計,按我正常的邏輯(僅限于本人的思維,不表示正常人的正常邏輯思維)思考,上一題都沒寫出來的話,這題應(yīng)該是做不到的吧。可是這個念頭很快就打消了,開國際玩笑吖,測試是我本行,開發(fā)我甚至可以一竅不通,用控制臺實現(xiàn)Hello World我可以完全不會,可是測試怎么能放棄,好不容易看到一道題考測試耶~立刻稀里嘩啦寫了一通我小小的腦袋瓜能想得到的一切可能用于測試的用例。
6. 考題算是告一段落,ok~正式進(jìn)入面試階段,諸如自我介紹,根據(jù)之前工作的項目經(jīng)驗提問的一系列問題,我滿腦子飄過的只有春晚大張偉唱的十幾個字:天空飄來五個字,那都不是事兒~為啥,自己做過的項目,再怎么地,就算自己描述不清楚還不能把對方說迷糊么?好吧,我只是隨口說說,還是會盡力將工作的一些情況如實稟報的。
當(dāng)問到自動化測試框架的時候,毫無意外地,搬出了我們工作所用的框架和Selenium類似這個看起來沒有說服力的理由,只是一個不小心說到了框架在功能測試上幫助比較大,但后臺數(shù)據(jù)貌似支持度不高,于是被面試官逮住問到,為什么框架不支持后臺數(shù)據(jù)?為什么?為什么?突然滿腦子的問號浮在了我臉上,不記得我嘴有沒有嘟鼓起來(我郁悶的時候很容易嘟嘴),我有病啊,沒事說什么對后臺數(shù)據(jù)支不支持,別人寫的框架,別人搞出來的問題,我怎么知道是對方不樂意寫出對后臺數(shù)據(jù)的支持還是沒開發(fā)完成這個框架啊?可是我總不能這么回答吧,于是,稍作思考,這個時候就特別嫉妒自己的小聰明,怎么會如此聰明的腦袋呢?哈哈,也許有一秒鐘時間我在微笑,然后回答到:因為我們這個框架是針對UI層設(shè)計的,主要是對頁面進(jìn)行操作并驗證相應(yīng)的功能,因此沒有提供對后臺的支持(不知道正確答案是什么,反正我就這么回答了,是正確的最好,不正確至少從我的角度忽悠了他,至于他是不是被忽悠到了,對我來說并不那么重要)。
回到家,把面試的事拋到了腦后,畢竟結(jié)束了,不管結(jié)果如何,接下來可能要面對的是IBM的面試,IBM要求的自動化腳本是由Java編寫的,這門對我來說可以算是完全陌生的語言(別鄙視我大學(xué)學(xué)過還敢說自己不知道這門語言),反正現(xiàn)在能看懂它已經(jīng)是算是我的極限了,也許只能聽天由命吧。
繼續(xù)翻開《C#函數(shù)式程序設(shè)計》的書籍(自己已經(jīng)好幾天沒有在博客上跟進(jìn)這本書的讀書筆記了,這幾天也不知道自己在干嘛,這本書被華麗麗拋在了腦后),突然就又想起了面試過程中沒有回答出來的題,String.Replace()方法的實現(xiàn),不能調(diào)用API。面試的時候沒有掏出手機作弊,這個時候也該搜索下答案了。
不打開百度搜索不知道,原來通過反編譯查看String的Replace方法是內(nèi)置實現(xiàn),而無法查看具體實現(xiàn)源碼,因此無法推斷出String的 Replace方法是如何實現(xiàn)的。尼瑪,故意的吧,反編譯都看不到的源碼實現(xiàn),讓我來實現(xiàn),我又不是編寫Visual Studio的程序員。好吧,抱怨歸抱怨,多理解一點東西總歸不是錯的,其實看完代碼,發(fā)現(xiàn)自己的思路還算沒有走偏,而且其實實現(xiàn)起來并不那么難,看來真的是自己編碼能力十分有限呢,咳,好吧,接下來的時間里繼續(xù)提升自己的編碼能力才是王道。
代碼如下:
[ThreadStatic]
static char[] mTempChars;
protected static char[] GetTempData()
{
if (mTempChars == null)
mTempChars = new char[1024 * 64];
return mTempChars;
}
public static string Replace(string value, string oldData, string newData)
{
char[] tmpchars = GetTempData();
int newpostion = 0;
int oldpostion = 0;
int length = value.Length;
int oldlength = oldData.Length;
int newlength = newData.Length;
int index = 0;
int copylength = 0;
bool eq = false;
while (index < value.Length)
{
eq = true;
for (int k = 0; k < oldlength; k++)
{
if (value[index + k] != oldData[k])
{
eq = false;
break;
}
}
if (eq)
{
copylength = index – oldpostion;
value.CopyTo(oldpostion, tmpchars, newpostion, copylength);
newpostion += copylength;
index += oldlength;
oldpostion = index;
newData.CopyTo(0, tmpchars, newpostion, newlength);
newpostion += newlength;
}
else
{
index++;
}
}
if (oldpostion < length)
{
copylength = index – oldpostion;
value.CopyTo(oldpostion, tmpchars, newpostion, copylength);
newpostion += copylength;
}
return new string(tmpchars, 0, newpostion);
}
好久沒寫這么長的文章了,尤其是和技術(shù)相關(guān)的文章,這次面試,權(quán)當(dāng)給自己一個經(jīng)驗的積累吧,繼續(xù)努力準(zhǔn)備接下來幾場我覺得對我來說比較重要的面試才好。順便說一下,感謝今天雨后的陽光,讓我邁出腳步,迎接了這么一場收獲頗多的面試~是天佑我,衷心感謝命運對我再一次的眷顧!
【筆試題目及難題解決方案筆試經(jīng)驗】相關(guān)文章:
java筆試題,筆試題目分享08-10
名企筆試經(jīng)驗筆試常識07-17