面試中純粹考算法的問題通常是讓不少程序員朋友痛恨的,這裏分享下我對於解答算法題的一些思路和技巧。程序員
通常關於算法的文章,都是從經典算法講起,一種一種算法介紹,見得算法多了,天然就有了感悟,但如此學習花費的時間和精力倒是過於巨大,也不適合在博客裏面交流。這一篇文,倒是專門講快捷思路的,不少人面對算法題的時候幾乎是腦子裏一片空白,這一篇文章講的就是從題目下手,把毫無思路的題目打開一個缺口的幾種常見技巧。
另外本人整理收藏了20年多家公司面試知識點整理 ,以及各類Java核心知識點免費分享給你們,我認爲對面試來講是很是有用的,想要資料的話請加羣1149778920 暗號: qf 來自行領取。**
面試
(一)由簡至繁
事實上,不少問題確實是很難在第一時間內獲得正確的思路的,這時候能夠嘗試一種由簡至繁的思路。首先把問題規模縮小到很是容易解答的地步。算法
[題目]有足夠量的2分、5分、1分硬幣,請問湊齊1元錢有多少種方法?數組
此題乍看上去,只會以爲徹底沒法入手,可是按照由簡至繁的思路,咱們能夠先考慮極端簡單的狀況,假如把問題規模縮小成:有足夠量的1分硬幣,請問湊齊1分錢有多少種方法?毫無疑問,答案是1。多線程
獲得這一答案以後,咱們能夠略微擴大問題的規模: 有足夠量的1分硬幣,湊齊2分錢有多少種方法?湊齊n分錢有多少種方法?答案仍然是1微服務
接下來,咱們能夠從另外一個角度來擴大問題,有足夠量的1分硬幣和2分硬幣,湊齊n分錢有多少種方法?這時咱們手裏已經有了有足夠量的1分硬幣,湊齊任意多錢都只有1種方法,那麼只用1分錢湊齊n-2分錢,有1種方法,只用1分錢湊齊n-4分錢,有1種方法,只用1分錢湊齊n-6分錢,有1種方法…學習
而湊齊這些n-二、n-四、n-6這些錢數,各自補上2分錢,會產生一種新的湊齊n分錢的方法,這些方法的總數+1,就是用1分硬幣和2分硬幣,湊齊n分錢的方法數了。spa
在面試時,馬上採用這種思路是一種很是有益的嘗試,解決小規模問題可讓你更加熟悉問題,而且慢慢發現問題的特性,最重要的是給你的面試官正面的信號——當即動手分析問題比皺眉左思右想看起來好得多。線程
對於此題而言,咱們能夠很快發現問題的規模有兩個維度:用a1-ak種硬幣和湊齊n分錢,因此咱們能夠記作P(k,n)。當咱們發現遞歸公式 P(k,n) = P(k-1,n - ak) + P(k-1,n - 2ak) + P(k-1,n - 3ak) … … 時,這個問題已是迎刃而解了blog
一般由簡至繁的思路,用來解決動態規劃問題是很是有效的,當積累了必定量簡單問題的解的時候,每每通向更高一層問題的答案已經擺在眼前了。
(二)一分爲二
另外一種思路,就是把問題一刀斬下,把問題分爲兩半,變成兩個與原來問題同構的問題,能把問題一分爲2,就能再一分爲4,就能再一分爲8,直到分紅咱們容易解決的問題。當嘗試這種思路時,其實只須要考慮兩個問題:1.一分爲二之後,問題是否被簡化了? 2.根據一分爲二的兩個問題的解,可否方便地得出整個問題的解?
[題目]將一個數組排序。
這個經典算法確定全部人都熟悉的不能再熟悉了,不過如果從頭開始思考這個問題,倒也不是全部人都能想出幾種經典的排序算法之一的,這裏僅僅是用來作例子說明一分爲二的思路的應用。
最簡單的一分爲二,就是將數組分紅兩半,分別排序。對於兩個有序數組,咱們有辦法將它合併成一個有序數組,因此這個一分爲二的思路是可行的,一樣對於已經分紅兩半的數組,咱們還能夠將這個數組分做兩半,直到咱們分好的數組僅有1個元素,1個元素的數組自然就是有序的。不難看出,按這種思路咱們得出的是經典數組排序算法中的「歸併排序」。
還有另外一種一分爲二的思路,考慮到天然將數組分紅兩半合併起來比較複雜,咱們能夠考慮將數組按照大於和小於某個元素分紅兩半,這樣只要分別解決就能夠直接鏈接成一個有序數組了,一樣這個問題也是可以再次一分爲二。按照這個思路,則能夠得出經典數組排序算法中的「快速排序」。
(三)化虛爲實
這種思路針對的是浮點數有關的特殊問題,由於不管是窮舉仍是二分,對於浮點數相關的計算問題(尤爲是計算幾何)都難以啓效,因此化虛爲實,指的是把有點"虛"的浮點數,用整數來替代。具體作法是,把題目中給出的一些浮點數(不限於浮點數,咱們不關心其具體大小的整數也能夠)排序,而後用浮點數的序號代替自己來思考問題,等到具體計算時再替換回來。
[題目]已知n個邊水平豎直的矩形(用四元組[x1,y1,x2,y2]表示),求它們的總共覆蓋面積。
由於座標可能出現浮點數,因此此題看起來十分繁複(能夠實踐上面由簡至繁和一分爲二的思路都基本無效),略一思考,矩形的覆蓋關係其實只跟矩形座標的大小有關,因此咱們嘗試思考將矩形的全部x值排序,而後用序號代替具體豎直,y值亦然,因而咱們獲得全部矩形其實處於一個2nx2n的區塊當中,這樣咱們用最簡單的窮舉辦法,能夠計算出每個1x1的格子是否被覆蓋住了。至此,只要咱們計算面積的時候,把格子的真實長寬換算回來,就已經獲得題目的答案了。
文末
本文以上三種思路,是我平時遇到算法問題的快速思考方向,並不是萬靈藥方,如果不能生效,就要靜下心來慢慢思考觀察了,考慮到面試的時候基本不會遇到高難度算法題,這幾種技巧的命中率應該不會過低,共享給你們,但願有所幫助
近段時間正值找工做的最佳時間,想要獲取更多的多線程或與微服務相關問題還有2020最近各大廠商的面試真題的能夠加羣1149778920 來和咱們一塊兒分享和交流,暗號:qf
如下是部分資料截圖(全部資料均已整合成文檔,pdf壓縮打包處理)。
**