對於如今找工作的小夥伴們,只要是涉及到程式設計的崗位,無一例外都會對程式設計進行考察,所以大家要在平時的學習中,多多的去練習程式設計,提高自己的程式設計能力。今天,小編就帶領大家來學習兩道出現頻率較高的趣味筆試題,讓大家在學習的過程中,來提高進步。
01兩地排程為題
1).題目描述:公司計劃面試 2N 人。第 i 人飛往 A 市的費用為 costs[i][0],飛往 B 市的費用為 costs[i][1]。
返回將每個人都飛到某座城市的最低費用,要求每個城市都有 N 人抵達。例如:
輸入:[[10,20],[30,200],[400,50],[30,20]]輸出:110解釋:第一個人去 A 市,費用為 10。第二個人去 A 市,費用為 30。第三個人去 B 市,費用為 50。第四個人去 B 市,費用為 20。
最低總費用為 10 + 30 + 50 + 20 = 110,每個城市都有一半的人在面試。
2).思路:
面對這種問題,我們可以採用貪心演算法來解決。
原因是,我們針對每一個人都找到他去往A地或者是B地的最低費用,而這樣的區域性最優解就能夠組成全域性的最優解。
這道題中,先把輸入的陣列按照兩地的費用之差的絕對值進行升序排序,然後當去往A地和B地都還有名額的時候,就去花費比較小的目的地。
如果去A地的名額滿了,那剩下的人肯定都得去B地,同理如果去B地的滿了,剩下的人都得去A地。
3).基礎解法:
上圖中的程式是基礎的解法,可以看到首先將費用列表按照費用差進行升序排序,然後根據去往A地和B地的人數以及費用的大小來判斷去往A地還是B地。程式總體是按照我們的思路來進行編寫的,非常容易理解。
4).進階版:
進階版的程式更加的巧妙,這是為什麼呢,首先,程式不再按照絕對值進行升序排序了,而是按照去往A地和去往B地的費用差值來排序,排序之後由於去往A地和B地都是總人數的一半,所以排序後的前一半的人,去往A地是最便宜的,而後一半的人是去往B地最便宜的,基於這個思路,程式就很容易理解了。
02.反轉二叉樹
對於二叉樹的考察,無論是在筆試還是面試中,都會是考察的重點問題,我們今天來理解一下高頻的筆試面試題,反轉二叉樹。對於二叉樹的反轉,這裡採用一個動態圖進行更加直觀的展示,來方便大家的理解。
1).思路:
可以看到,反轉二叉樹就是從根節點開始,左右子樹全部交換,左子樹變為右子樹,從上圖我們也可以看出,這是一個典型的遞迴問題,也就是我們可以透過不斷的遞迴迭代來交換一棵樹的左右子節點,來達到整體的反轉二叉樹的目的。
2).遞迴版本:
上述的程式中,可以看到,當節點是None時,說明達到了葉子節點了,此時返回None,否則的話,就不斷的遞迴呼叫函式本身,來反轉該節點下的左子樹和右子樹,從而達到反轉二叉樹的目的。
除了有遞迴迭代的版本之外,可以利用queue的特點來實現二叉樹的反轉,queue的特點是先進先出。
3).Queue版本:
上述的程式中,首先我們判斷root是否為空,為空的話則直接返回None即可。接下來就是利用queue,只要queue不為空,那麼我們就pop掉queue中的最後一個元;
然後反轉它的左右子節點,如果該子節點的左右子樹不為空,就新增到myqueue中,繼續迴圈,來反轉其左右子樹的子節點。以此來達到反轉整個二叉樹的目的;
可以看到,queue的版本中,並沒有用到函式的遞迴迭代,而時用到了queue的先進先出的性質來進行了二叉樹的反轉。
總結
今天,帶領大家學習了兩個高頻的筆試面試演算法題,大家要仔細的將程式理解,並要學會如何巧妙的使用這些演算法,來解決其他類似的演算法題,只有勤加練習,才能成為高手,希望大家能在日常中,多多刷題,提高自己的能力。