程序員在面試時是否會被要求手寫代碼?
最優的演算法是 O(N) 時間,Longest palindromic substring。不過應屆生面試能寫對 naive O(N^3) 時間 O(1) 空間的演算法就算做對了吧。能寫出 O(N^2) 時間 O(1) 空間的就算十分優秀了。 Longest Palindromic Substring Part I貼一個隨手寫的 O(N^3) 實現,供 debug 用:Ideone.com - qZ8bG4—我說,你覺得這個代碼的複雜度是多少啊?
—好像是「嗶—」啊。
—為什麼呢?—因為我產生了很多臨時字元串。—那你覺得還有優化的空間嗎?
—如果這般如此,如此這般的話,應該可以幹掉臨時字元串,然後複雜度就可以降低到「嗶—」了。
—好吧,那你把你的想法寫出來看看。
—……
一般會是這個樣子的
作為一名面試官,我很少面試語言的細節,這些都是可以通過看書或者手冊學習到的。我比較喜歡看應聘者解決問題的能力。
原文太長,就不貼出來了。一次關於浮點數的面試。
很多畢業生都把計算機學成了文科,他們不是在學習理論知識,而是被動接受/背誦記憶這些知識。他們來公司,編程只是他們的工作而已,聘用他們的真正目的是解決問題,用程序解決很多人共性的問題。
我面試時,他們可以使用任何工具甚至Google,當然,我出的題目一般都不能直接個Google到,雖然網上沒有現成的答案,但是可以總結出答案。我的觀點是,如果你的任何問題都可以用Google直接解決,你不可能成為一名特別優秀的程序員。
你搜索到的是數據,即使你保存在了evernote,說白了就是01串,你閱讀了,思考了,這些數據就變成了信息,0101010…11101 編程了 int a = 4; 你再繼續思考,使用,深化,這些信息就變成了知識。 你會說:『哦,這不是李氏代換原則嗎?』
最後重申一下:學歷代表過去,能力代表現在,學習能力代表將來
【下一條】
邀請你加入群聊,程序源·微吧。
我覺得關注效率有點坑,要快的話用後綴數組或拓展kmp都可以實現O(nlogn),但當場手寫出來會很坑爹,能不能運行都是問題。我覺得當場的話實現一個清晰易理解易調試的代碼更重要吧個人覺得手寫代碼是一個很重要面試過程。
一段代碼,就代表著這個人。代碼能直接體現他的價值觀。在寫的過程中,至少能看出這些問題
- 取名字,傳參數是不是很隨意。隨意的取名是維護的噩夢。
- 介面,函數設計能力。是解決具體問題,還是能解決一類問題,別的同事如何使用你的代碼。
- 思路是否清晰,代碼結構是否層次分明。提筆之前,想清楚自己要幹什麼。
- 代碼可讀性,可維護性。
- 邊界問題,細節處理是否合理。直接關係到這個人的bug率。
- 打算如何測試自己的代碼。對代碼的責任心。
- 寫代碼過程中和面試官的溝通次數。這個人的溝通能力和溝通慾望。
面試中就算能把各種概念說得天花亂墜,最終還是要看寫出來的東西。
我們需要乾淨清晰好維護的代碼,沒有人想去管理一堆垃圾。------------------------------- 我是分割線 ----------------------------------------
評論中提到最多的問題是:為什麼要「手寫」。
先看看機寫的好處吧:1.語法高亮,自動排版,文字字體一致
2.自動補全,頭文件自動包含,依賴包自動導入3.代碼可隨意刪改重寫
4.可以通過編譯來查錯手寫代碼時,上述問題都是面試者需要考慮的。
- 沒有自動排版,手寫問題不大,注意一下即可。
- 字寫得丑沒法避免,但只要能讀,問題也不大。
- 頭文件包含問題,屬於基礎知識吧。
- 手寫的代碼不可隨意刪改,每劃掉一塊,紙面上都是一個「疤痕」,有代碼潔癖的人是無法忍受滿紙疤痕的,這要求寫代碼的思路清晰。「疤痕」的數量直接能看出問題。曾經面試過一些做過ACM的應屆生,寫出來的代碼漂亮得像藝術品,結構清晰,沒有刪改。這不是說只要做過ACM的程序就是好,而是說代碼寫的好壞與寫過的代碼量是相關的。
- 手寫無法編譯查錯。某些手誤還可容忍,語法錯誤和邏輯錯誤就是大問題了。自己寫的代碼,自己要有信心保證沒有錯誤,不能自己都不知道有沒有問題,把查錯責任全推給編譯器。
因此,手寫其實帶上了很多約束條件,正是這些約束會讓人不愉快,但一個嚴謹的人,應該能從容應對這些約束。「手寫」正是作為一個過濾器,來找到我們希望與之合作的同事。
我們公司首席架構師每次面試java或者演算法崗都會要人手寫代碼(貌似js也會,不過會簡單很多,例如反轉字元串快排之類的)
有一次跟他一起面試一個java,讓用C寫一個處理幾TB數據到另外一種格式的演算法,我看的都滿頭大汗,不過還好,其實他主要看思路,並沒有什麼最佳實踐一說,甚至你程序跑不通也沒事,寫偽代碼就夠了。另外多一點內存或者不管用時間換空間還是空間換時間都是沒有問題的,頂多問問你有什麼優化的思路,不過手寫代碼真的挺累的,有一次生生的把一個小姑娘面哭了,自從那以後,他應該就沒那麼嚴厲了。。。
最長迴文子串寫mc啊。。北美大小公司面試過N家,包括FLAG巨頭和startups。可以很負責的說,白班/白紙 上面手寫代碼
【幾乎是所有面試都會用的】除了極個別有上機題的公司。所以樓主要好好練習手寫代碼,這和平時用IDE寫代碼完全是兩碼事。先回答樓主的問題:面試官更注重效率還是代碼清晰度?
答案是,都重要!效率代表了你的演算法,你的分析能力,解題能力。代碼清晰度代表了你的風格,你的代碼是否易讀。代碼風格包括:
- 方法命名
- 變數命名
- API設計/命名
- 縮進
- 空格
等等。
代碼風格可以說很久,這裡就不詳細討論,如果有問題可以私信我你需要明白,面試官考察的內容之一,就是你的代碼是否好理解,好閱讀。因為你有可能會成為他們未來的同事之一。試想一下,如果你寫的代碼可讀性非常的低,然後你的同事需要和你一起debug,有誰願意去讀不好理解的代碼呢?
如果我理解對了題目的話,題目是最長迴文串,這個是一個經典的動態規劃問題,當然用循環也可以解。
樓主的代碼,思路很清楚,很易讀,但也有一些小問題
1:樓主只檢查了長度&<=1的情況,如果input是null怎麼辦?(我對C/C++不是很了解,如果不用擔心NULL問題,請忽略)2:樓主在for循環里,省略了if語句的括弧,個人是不建議這樣做的,不是一個良好的coding style。
3:(樓主的主語言是java,不知道C/C++里是否有stringbuilder這個東西)在JAVA裡面,string是immutable的,也就是說每次創建一個string是非常昂貴的,樓主需要知道,有個東西叫StringBuilder,寫代碼的時候你不一定要用,但是你如果能讓面試官知道,你對這個是有了解的,會對你有大大的加分。至於題目的時間/空間複雜度,最差的解法是暴力法 o(n^3),最優的解法我記得是o(n),不過一般人都是想不出的。一般能想出o(n^2)的解法,是可以接受的。
另外,個人建議樓主把動態規劃的解法也理解。因為很有可能發生以下的情況
你:我用循環做出來了,複雜度O(N^2)面試官:很好,很好,你知道這個題目怎麼用動態規劃解嗎?祝樓主好運,如果有任何問題,可以私信我。加油!
不說對錯,只說經歷。說的是面試經歷哈。第一個,有筆試,薪酬最多給5k。第二個,沒筆試有機試,最高6.5k。
第三個,只面試,12k。我非常非常不喜歡在紙筆上寫代碼,以前在學校的時候逢到哪個老師考試要叫紙筆寫代碼我就覺得傻逼。同樣,如果以後去哪家公司面試碰到讓紙筆寫代碼,我一定覺得來錯地方了。
但是,請注意,這並不意味著這樣的測試沒有相應的替代形式。比如,可以選擇上機寫,哪怕不給 IDE,但起碼要給 TextPad 或者 UltraEdit 或者 Sublime Text 這樣的編輯器。
但最好最好的,是什麼?是 Google Doc 或者 iCloud Pages 這類能協同工作的在線文本編輯網頁。
要知道,傳統的紙筆有一個最大的毛病,就是——「刪改太麻煩」!程序員寫代碼的時候思維要清晰,但是書寫肯定是跳躍的,它不像寫文章一樣按部就班一段段地來。一個方法,叫什麼名字最好?一個變數,先定義成全局的,寫著寫著發現沒必要,拿下來變成局部的。甚至,寫著寫著發現這兩個方法貌似可以抽到一個裡面來啊?等等等等……這些都會在寫代碼的時候導致刪除或者重寫。
如果你對上述過程有懷疑,請看下面 Android 的一個官方視頻,這個視頻裡面 Google 的工程師演示了一個從0開始寫一個 Android 應用的過程,並且告訴了你有時候犯錯不一定是壞事。你可以看到 Google 的工程師在寫這個 App 時犯了哪些「錯誤」,當人家發現一個地方寫的不好或者不對時,是不是也是改來改去的。(看不了的說明你還不適合干 Android 開發)
我之前見過 Google 官方放出的一個面試指導視頻。人家也有考現場寫代碼的過程,但人家怎麼考?不是紙筆,而是請面試者打開面試官發送給他的一個 Google Doc網頁。Google Doc 可以實時共享查看(協同工作),兩個人開同一個頁面,你改了什麼,對方那邊是實時反映的,這意味著你的面試官可以在另一端看到你在這張 Page 上怎樣完成了這段代碼,你先寫了哪個變數,後寫了哪個方法,中途覺得哪裡不對勁,做了怎樣的刪除,怎樣的修改……從開始到最終完成,面試官一清二楚。而且我相信,這也才是面試過程中手寫代碼的要義所在。
設想一下,如果真的面試者最後交上來的,只有一張被擦得皺巴巴的白紙,你又怎麼透過這張白紙,知道面試者在解決這個問題時進行了怎麼樣的思考呢?時代跟技術永遠是在進步的,紙筆寫代碼早該被淘汰了,白板文化過後,在線協同的才是王道。
曾經被要求過,而且要求的是上機去寫,沒有理他們,沒給他們寫。個人認為:要求上機寫的公司,都是不專業,不會面試的互聯網公司或者是不是互聯網公司。手寫代碼,在紙上寫個演算法可以接受。
呵呵我就想跟那些說手寫好的說一句話沒圖說個JB先上你們自己手寫的程序再說話好嗎
看了一些回答後我覺得以後要去面試的話得帶上電腦了。我tm拒絕手寫代碼
我面大公司每輪都要求手寫代碼。
寫寫iOS程序試試,方法名字太長了。
如果非得通過讓面試者寫代碼才能識別對方技術能力的話,那麼這個面試官多半在技術層面上是不合格的,一個二叉樹反轉就可以把很多人問的聞風喪膽,對於資深的面試官來講,不寫代碼他也能看出你是不是「李鬼」,如果此人非較勁讓你寫,建議走技術棧的求職者可以直接忽略該公司,去準備下一家面試即可~我們現在在面試程序員之前都會讓他們線上做一套猿圈測試題,如果測試結果達到要求才會約面試,並且面試的時候針對測試結果提一些有針對性的題,手寫代碼這種浪費大家時間的事情反正我們沒做過......
手寫的話,看重思路。
上機寫的話,還會看重編碼規範。
如果我是面試官的話。
我現在基本寫代碼就是手寫的 vim對我來說基本就是一個寫字的軟體 不過也就寫一寫c的代碼
聽說有的面試官會讓在一張紙上手寫代碼。
手寫非常反感,但是沒辦法,也面試過上機編程的就我實習的面試經歷來說,會。
我一直認為面試的時候手寫代碼其實是比筆試手寫更好的方式,當然是對我一個被面試者而言。面試的時候寫代碼可能會遇到一些不太熟悉的地方,這個時候你需要向面試官展示自己的思路,並且一步步優化自己的代碼。從某種意義上來說,會寫代碼很重要,但是會寫代碼並且能夠向別人展示你的思路更重要。
目前公司面試時就來了一把手寫代碼,面試官還故意裝凶增加心理壓力,這種陣勢我第一次見到,面得我滿頭大汗…進去後發現面試官是個逗比與毒舌共存,一句話秒殺PM的人…
推薦閱讀:
※C++里,typeid里的type_info是怎麼構造出來的,或是type_info從來沒有被構造?
※你見過哪些很贊的宏定義?
※如何利用樹莓派學習Linux及Python?
※編程好學嗎?
※你們都通過閱讀開源的代碼獲得了哪些跟操作系統和語言無關的技術知識?