手機分配短訊id的面試題目 釐清需求篇

2021-05-25 22:42:02 字數 2207 閱讀 7872

前陣子,筆者在toplanguage論壇裡參與討論了乙個不錯的面試題目,在此和大家分享,也當作個人的討論總結。本文列出該問題,並模擬應試者向面試官的對話,以釐清問題需求。

事緣dbger發起的帖子中,liuxinyu舉了乙個面試題目,原文如下:

有個老的手機簡訊程式,由於當時的手機cpu,記憶體都很爛。所以這個簡訊程式只能記住256條簡訊,多了就刪了。

每個簡訊有個唯一的id,在0到255之間。當然使用者可能自己刪簡訊,現在我們收到了乙個新簡訊,請分配給它乙個唯一的id。說白了,就是請你寫乙個函式:

1byte function(byte* ids);

該函式接受乙個ids陣列,返回乙個可用的id,由於手機很破,我要求你的程式盡量快,並少用記憶體。注意:ids是無序的。

筆者認為,面試時,並不一定要急著解答問題。面試(interview)並非考試(examination),面試中雙方可透過交談去評估對方是否合適的雇主/雇員。若對面試題目有疑問,應盡量溝通釐清。這也反映實際軟體開發時,程式設計師須具備足夠的問題需求分析和溝通能力。筆者相信,大部分負責任的面試官,也喜見應試者提出切合實際的問題。

以下筆者嘗試以對話形式,虛構乙個釐清需求的情境。 (甲=面試官,乙=應試者)

甲微笑著說:你對紙上的題目清楚麼?

乙認真地看著試題,猶豫片刻。

乙突然發問:在這個函式原型中,ids應該是乙個非固定長度的陣列,代表現時已分配的id集合。那麼該函式怎樣可以得知ids陣列的長度呢?我想到,由於0-255都是id的範圍,似乎不可用簡單的結束符,例如像null-terminated string那樣用0去表示陣列的結束。

突然而來的長問題,輪到甲猶豫了,立刻把紙上題目快讀一遍,發現似乎真是個問題。

甲:嗯……這是個好問題,可能是出題同事的手誤。這樣吧,加上乙個size_t n的引數,代表ids陣列的有效元素數目。

乙輕輕點頭,覺得這個修正最為簡單直覺。之後更放心把想到的問題都提出來。

乙:想確認一點,n是否必然少於255,換句話說,該函式必然能正常輸出乙個id?

甲:是的。本題目不要求處理其他輸入錯誤的情況,例如ids為null、ids裡有重複值等。可假定輸入資料都是有效的。

乙:想確認一點,傳回的id只要不存在於ids陣列便可,不需傳回最小的id吧?

甲:沒錯,沒這個需求。

乙有點不好意思地說:對於函式原型,我還有個問題……

甲心想不是還有手誤吧。但甲還是帶著微笑,示意繼續問。

乙:其實也是關於ids陣列的。由於原型沒寫明為const byte *,想問此函式可否改動ids陣列的內容?或者再進一步說,此函式是否純函式(pure function),沒有***(side effect)?

甲松了一口氣,因為這不算是問題的缺陷。總算保住公司的面子。

甲充滿信心地說:對於ids陣列的內容是否能改變,你可分為兩個情況去考慮。而除了這個引數之外,此函式不會有其他***。

乙:哦,明白了。此外,雖然我未考慮周詳,但似乎要獲得更高執行效率,便需要額外的儲存狀態,或許要設另乙個介面才行。

甲喜形於色地回答:是的,也許可以透過空間換取時間。那麼你對介面有提議麼?

乙邊說邊寫:我想,或許另一種介面的形式是這樣的……

1structmanager ;

甲:好。這個是比原題目更抽像的情況。若時間足夠,你也可在答題時對這種介面進行補充。

乙:最後想問,該手機的cpu是32位的吧?

甲沒有預先對此設限,就順著回答了。

甲:就當作是32位的吧。

乙:我暫時沒想到其他問題了。

甲:那好,你可以開始在紙上作答,我們一小時後再討論。

乙:謝謝您。我現在對題目的需求應有充分理解了。我會盡量想出多個解。

甲覺得乙有細心閱讀題目,發問的內容和技巧也不錯。乙也認為甲能耐心地聆聽,並給與合理清晰的指示,甚至給與他一些彈性、一些發揮的機會。

最後一句中,乙提及的「多個解」也使甲留下印象和期待。因為很多時候,某個問題並不一定有最優解,能設想多個解,並分析比較每個解的優缺點,能體現程式設計師的基礎能力。

執行緒的面試題目

1.子執行緒迴圈 10 次,接著主線程迴圈 100 次,接著又回到子執行緒迴圈 10 次,接著再回到主線程又迴圈 100 次,如此迴圈50次,試寫出 2.編寫乙個程式,開啟3個執行緒,這3個執行緒的id分別為a b c,每個執行緒將自己的id在螢幕上列印10遍,要求輸出結果必須按abc的順序顯示 如...

經典的C 面試題目

1.介紹一下stl,詳細說明stl如何實現vector。answer stl 標準模版庫,standard template library.它由容器演算法迭代器組成。stl有以下的一些優點 可以方便容易地實現搜尋資料或對資料排序等一系列的演算法 除錯程式時更加安全和方便 即使是人們用stl在uni...

Go總結的面試題目

是安全的 不安全 1.同時新增相同的元素可能會發生碰撞覆蓋2.同時對陣列進行擴容會有資料丟失 hashtable concurrenthashmap synchronized map 切片是指標型別,陣列是值型別 陣列的長度是固定的,而切片不是 切片是動態的陣列 切片比陣列多乙個屬性 容量 cap ...