如何做cc150演算法題

2021-06-19 22:30:23 字數 2722 閱讀 7152

高頻題:

解題思路和答案:

coding前問好問題:

當我看cracking這書時,把注意力更多的放在了解題上,經常是一看到題目就提筆想解決辦法,然後coding。這種做法,不論是在實際的解題過程中,還是在面試中都是不可取的,這也是導致我被拒的主要原因,我覺得。就目前我面過的而言,面試官想看的往往不是你多聰明,多快地想出解決辦法,是否給出了最優解,而是想知道你解決問題的思路。當然能夠給出最優解也很重要,但不能一開始就把重心放在這上面。我們平時上課寫作業時,老師給的問題不會很模糊,也不會很複雜,需要的條件和假設也都會事先給你,往往不需要你考慮很多細節。但面試過程中,面試官問的問題往往很模糊。雖然模糊,但你真要立馬coding也可以,不過coding時需要考慮到非常多問題,考慮的情況太多,會把程式複雜化,也很容易擾亂你的思路,應該沒有幾個面試官會喜歡這樣的。為了能夠很好的解決問題,需要你問一系列clarifying問題,把problem具體化,把那些需要知道的細節都理清楚,比如乙個字串多長,是不是null terminated的,有沒有memory limit,等等。我想實際工作中解決問題的情況不比在學校時,對於任何給你的問題,都先搞清楚它的background,各種可能的影響因素,然後才能在這些給定的條件或假設下給出解決辦法。不要害怕問問題,也不用擔心問問題會讓面試官覺得你不會做這題目。至於問什麼樣的問題就取決於問題本身了,盡可能地做細緻地考慮。現在我看到問題會想一下有哪些unclear的地方,但考慮的只是一些可能影響到coding的細節,還是不夠細緻,問的問題也不夠多。

現在看來,做cracking上的題目時,主要目的不是記住什麼樣的問題用什麼樣的解法,而是培養解題的思路,如前所說的,問那些clarifying question,該考慮那些因素,等等。拿到一道題,先讀題,思考,然後發問,列出哪些問題需要clarify,然後想解決辦法。cracking裡每個問題的sample answer都值得好好讀一下,不只是看**,還要看下人家是如何思考如何發問的。我雖然做了不少題,但把重點都放在寫**上了,沒有練練前期的思考發問

coding:

等所有的疑問都clear之後,才開始寫**。寫**也挺重要,盡量不要出現bug。寫**的過程中還要和面試官交流,不能埋頭在那些。不過邊寫**邊說有點難度,還會影響思路,比較好的辦法是,寫完乙個block就說一下這個是幹嘛的。寫完code之後,不要馬上和面試官說寫完了,應該自己先複查一遍,找出可能的問題,修改之,然後再說完成。之後面試官可能會讓你測一下**,或者讓你改進,或者改變問題後讓你修改**等等,得有心理準備,follow up的問題可能很刁鑽。根據面的崗位不同,follow up的問題可能和特殊的崗位有關。比如ms時我面的testing職位,四個面試官都問了我testing的問題。不過不是單獨給我問題讓我test,而是基於之前寫的code,做的設計等進行測試。如何測試可以看看cracking書上的testing章節。針對問題找比較好的解決方法和coding過程就取決於平時積累和臨時準備了。網上有各種各樣的面試題和面經,careercup,glassdoor,mitbbs。為了gg和ms的面試,除了做了cracking上的一些題,我還找了些面經裡出現的題目看。

如何回答技術問題

問好問題, 以縮小原問題的範圍, 如資料型別是什麼, 數量級有多大.盡量假設更多的條件

設計演算法時,需要考慮的問題

寫出偽**

認真寫出真實的**

測試你的**

五種解決演算法題的方法

從示例資料推導出規律以及解題演算法.

模式匹配: 從題幹,推導出相應的演算法.

將複雜的問題簡化,抽象

從簡單/基本的情況, 反推導出複雜情況時的解決方法

資料結構遍歷和匹配, 通過題幹的內容,遍歷自己了解的資料結構,然後找到合適的乙個以解決問題

question

data structure in question

data structure in solution

algorithm in solution

coding

題目:非常關鍵,乙個題目通常有一些相應的變形題目,同乙個題目可能有不同的要求

。比如時間複雜度,空間複雜度的要求,比如recursive,

iterative的要求。而根據題目的變形與要求,可能會極大的影響到你能夠採取的資料

結構和演算法。

問題中的資料機構:問題中有可能帶資料結構,有可能沒有資料結構,有可能是可以自

定義資料結構

解決方案中的資料結構:可以是in-place的,也就是利用已有的資料結構,也可能是創

建新的資料結構。新的資料結構跟已有的資料結構沒有必然的聯絡,而很多問題都是一

題多解,可能採取不同的資料結構。

演算法:一般來說,當解決方案中的資料結構確定以後,演算法也就確定了。同樣,一旦解

決方案的演算法確定,相應的資料結構也就確定了。這兩個沒有先後的關係,但解決方案

中的資料結構和演算法具有非常緊密的聯絡。

**:非常關鍵。**就是解決方案的資料結構和演算法的實現了。目前來看,題目,數

據結構和演算法在面試中出現的型別比較固定,因此**的好壞則是拉開面試者水平的一

個有效手段。這也是為什麼f,g如此看中**的質量了。我發現上面幾點比較容易突擊

,但是寫**的功力還是需要實打實的積累的。

cc150 括號問題

一 題目 implement an algorithm to print all valid properly opened and closed combinations of n pairs of parentheses.二 思路及其 實現 關係 s n s n 1 中每乙個元素與1對括號配對組...

cc150 硬幣問題

given an infinite number of quarters 25 cents dimes 10 cents nickels 5 cents and pennies 1 cent find how many ways to represent n cents.思路 從最大面值的硬幣開始分...

CC150 需整理彙總

漢諾塔問題 p141 用兩個stack設計乙個佇列 p142 結合上題,佇列實現max操作,要求盡量提高效率。程式設計之美 找出二叉樹中指定節點的下乙個節點 中序後繼 假定每個節點有父指標。p154 二叉樹某兩個節點的公共祖先。p155 判斷t2是否是t1的子樹。p159 列印二叉樹節點數值總和等於...