知乎高贊!2道大廠高頻筆試算法題!你會嗎?

對於如今找工作的小夥伴們,只要是涉及到編程的崗位,無一例外都會對編程進行考察,所以大家要在平時的學習中,多多的去練習編程,提高自己的編程能力。今天,小編就帶領大家來學習兩道出現頻率較高的趣味筆試題,讓大家在學習的過程中,來提高進步。

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的先進先出的性質來進行了二叉樹的反轉。

總結

今天,帶領大家學習了兩個高頻的筆試面試算法題,大家要仔細的將程序理解,並要學會如何巧妙的使用這些算法,來解決其他類似的算法題,只有勤加練習,才能成爲高手,希望大家能在日常中,多多刷題,提高自己的能力。

程序員GitHub,現已正式上線!

接下來我們將會在該公衆號上,專注爲大家分享GitHub上有趣的開源庫包括Python,Java,Go,前端開發等優質的學習資源和技術,分享一些程序員圈的新鮮趣事。

目前wx搜索Python 【菜鳥學Python】排第二,匯聚了30萬Python愛好者,累計原創近400篇趣味乾貨(爬蟲,數據分析,算法,面試指南,原創趣味實戰,Python遊戲,機器學習),歡迎一起學Python,交流指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章