今日找人突擊面試經驗和編程思路,雖然這些不能速成,但也是頗受啟發,得到了幾點告誡:
1.面試過程要循序漸進,先從最簡單的解決思路開始,逐漸優化到次優和最優
2.準備面試,各種類型的題目都接觸一點,txt寫代碼和想思路的時間各占一半
3.當我們拿到題目的時候,首先要想怎么用邏輯思維解決這個題目,然后思考編程怎么實現,不要直接用編程思維去想題目,這樣非常容易卡死。
下面描述幾個算法題:
1.微軟的2個題目其1:
https://hihocoder.com/problemset/problem/1499
難度L2
對于任意一個機器人而言,有三種狀態:造機器人、做任務+造機器人、一直做任務。最優的情況一定是先造足夠多的機器人,然后開始做任務,因為如果你交叉進行,那么做相同任務花費的時間可能更多,因為一個機器人做任務和造機器人穿插進行所做的任務<機器人造相同數目的機器人然后一直做任務。貪心策略
2.微軟的2個題目-其2
https://hihocoder.com/problemset/problem/1500
難度L3
這個題目本身不是特別難,但是很復雜,是一個與樹相關的問題。每一個節點都可以求一個最小代價,逐層向上。【背包問題:能夠獲取足夠信息的最小代價(每個點僅與自己的孩子有關)】
3.Different ways to addParentheses
https://leetcode.com/problems/different-ways-to-add-parentheses/#/description
遞歸+記憶化
從數學的思維來理解,而不是加括號的方式來理解,因為括號只是一種運算優先級的表示,括號要加起來,可能能加很多個。從數學思維來理解,考慮最后一個運算的符號,可能是所有符號中的任何一個,左邊一坨的結果集和右邊一坨的結果集操作【遞歸】,某兩個數字之間得到的結果集是固定的,那么可以用dict記錄下來【記憶化】。
可以用python的set來實現
import?collections
s = collections.Counter()
s.update("aaabbbbcc")
print(s)
4.BestTime to Buy and Sell Stock with Cooldown
https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/#/description
動態規劃
如果沒有銷售冷凍的這種情況,任何時候我當前的操作均由下一天決定,如果第二天股票漲了那我就買,如果第二天股票跌了那我就賣出去,在不斷地買賣過程中累積利潤。
F(I,j):第i天開始狀態為j;如果j為手上持股狀態,該值表示股票數目;如果j表示手上不持股狀態,該值表示總利潤。
F(I,手上持股)=max { F(I-1,手上不持股)/Price(I-1),F(I-1,手上持股)}
F(I,手上不持股/前一天剛賣,今天冷凍)=F(I-1,手上持股)*Price(I-1)
F(I,手上不持股/今天不冷凍)=max {F(I-1,手上不持股/不冷凍),F(I-1),手上不持股/冷凍}
Function表示的是狀態,+-*/表示狀態之間的操作【動態規劃】
5.貪心策略
Minimum Number of Arrows to Burst Balloons
https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/#/description
從數學的思路去思考,每次找最小的右端點,能夠保證射中的最多,然后找到端點后,將射中的區間移除。
6.中位數
https://leetcode.com/problems/wiggle-sort-ii/#/description
找到中位數,將中位數右邊的數字插入左邊的序列。O(n)的時間找中位數,隨機選取一個數,將比他大的放左邊,比他小的放右邊,取中位數下標的那一邊。
7.位運算
https://leetcode.com/problems/integer-replacement/#/description
使用動態規劃的思路,先將這個數轉換成二進制,偶數就是移位操作【右移】。基數有兩種操作,取更小的那個。
F(n):n為偶數直接右移一位;n為基數取min【+1或者-1】
8.拓撲排序
https://leetcode.com/problems/course-schedule/#/description
拓撲排序,每一個課程算是一個樹的節點,有依賴關系的課程建立一條邊。如果這些點和邊可以構成有向無環圖,有解;如果有環,則無解。
思路1:建立一個隊列,找入度為0的點加入隊列,遍歷隊列中的點,將每個點的后繼加入圖,同時把該后繼的入度減1,標記已經加入圖的點。如果在這個過程中遇到了入度為0的點就把他加入圖。如果最后圖中沒有包含所有的點,則無解。
思路2:將所有的邊反向,你要輸出一個點,必須輸出這個點的前驅【反向邊就是后繼】,這樣保證先修,知道你輸出了所有的點,如果不能那就無解。
9.并查集:維護連通性