面試時演算法題的解答思路

2022-02-03 08:34:15 字數 2276 閱讀 5862

面試中純粹考演算法的問題一般是讓很多程式設計師朋友痛恨的,這裡分享下我對於解答演算法題的一些思路和技巧。

一般關於演算法的文章,都是從經典演算法講起,一種一種演算法介紹,見得演算法多了,自然就有了感悟,但如此學習花費的時間和精力卻是過於巨大,也不適合在部落格裡面交流。這一篇文,卻是專門講快捷思路的,很多人面對演算法題的時候幾乎是腦子裡一片空白,這一篇文章講的就是從題目下手,把毫無思路的題目開啟乙個缺口的幾種常見技巧。

(一)由簡至繁

事實上,很多問題確實是很難在第一時間內得到正確的思路的,這時候可以嘗試一種由簡至繁的思路。首先把問題規模縮小到非常容易解答的地步。

[題目]有足夠量的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-2、n-4、n-6這些錢數,各自補上2分錢,會產生一種新的湊齊n分錢的方法,這些方法的總數+1,就是用1分硬幣和2分硬幣,湊齊n分錢的方法數了。

在面試時,立刻採用這種思路是一種非常有益的嘗試,解決小規模問題可以讓你更加熟悉問題,並且慢慢發現問題的特性,最重要的是給你的面試官正面的訊號——立即動手分析問題比皺眉冥思苦想看起來好得多。

對於此題而言,我們可以很快發現問題的規模有兩個維度:用a1-ak種硬幣和湊齊n分錢,所以我們可以記做p(k,n)。當我們發現遞迴公式 p(k,n) = p(k-1,n - ak) + p(k-1,n - 2*ak) + p(k-1,n - 3*ak) ... ... 時,這個問題已經是迎刃而解了

通常由簡至繁的思路,用來解決動態規劃問題是非常有效的,當積累了一定量簡單問題的解的時候,往往通向更高一層問題的答案已經擺在眼前了。

(二)一分為二

另一種思路,就是把問題一刀斬下,把問題分為兩半,變成兩個與原來問題同構的問題,能把問題一分為2,就能再一分為4,就能再一分為8,直到分成我們容易解決的問題。當嘗試這種思路時,其實只需要考慮兩個問題:1.一分為二以後,問題是否被簡化了? 2.根據一分為二的兩個問題的解,能否方便地得出整個問題的解?

[題目]將乙個陣列排序。

這個經典演算法肯定所有人都熟悉的不能再熟悉了,不過若是從頭開始思考這個問題,倒也不是所有人都能想出幾種經典的排序演算法之一的,這裡僅僅是用來做例子說明一分為二的思路的應用。

最簡單的一分為二,就是將陣列分成兩半,分別排序。對於兩個有序陣列,我們有辦法將它合併成乙個有序陣列,所以這個一分為二的思路是可行的,同樣對於已經分成兩半的陣列,我們還可以將這個陣列分作兩半,直到我們分好的陣列僅有1個元素,1個元素的陣列天然就是有序的。不難看出,按這種思路我們得出的是經典陣列排序演算法中的「歸併排序」。

還有另一種一分為二的思路,考慮到自然將陣列分成兩半合併起來比較複雜,我們可以考慮將陣列按照大於和小於某個元素分成兩半,這樣只要分別解決就可以直接連線成乙個有序陣列了,同樣這個問題也是能夠再次一分為二。按照這個思路,則可以得出經典陣列排序演算法中的「快速排序」。

(三)化虛為實

這種思路針對的是浮點數有關的特殊問題,因為無論是窮舉還是二分,對於浮點數相關的計算問題(尤其是計算幾何)都難以啟效,所以化虛為實,指的是把有點"虛"的浮點數,用整數來替代。具體做法是,把題目中給出的一些浮點數(不限於浮點數,我們不關心其具體大小的整數也可以)排序,然後用浮點數的序號代替本身來思考問題,等到具體計算時再替換回來。

[題目]已知n個邊水平豎直的矩形(用四元組[x1,y1,x2,y2]表示),求它們的總共覆蓋面積。

因為座標可能出現浮點數,所以此題看起來十分繁複(可以實踐上面由簡至繁和一分為二的思路都基本無效),略一思考,矩形的覆蓋關係其實只跟矩形座標的大小有關,所以我們嘗試思考將矩形的所有x值排序,然後用序號代替具體豎直,y值亦然,於是我們得到所有矩形其實處於乙個2nx2n的區塊當中,這樣我們用最簡單的窮舉辦法,可以計算出每乙個1x1的格仔是否被覆蓋住了。至此,只要我們計算面積的時候,把格仔的真實長寬換算回來,就已經得到題目的答案了。

本文是某天在qq群裡討論面試時的演算法問題時想到要寫的,以上三種思路,是我平時遇到演算法問題的快速思考方向,並非萬靈藥方,若是不能生效,就要靜下心來慢慢思考觀察了,考慮到面試的時候基本不會遇到高難度演算法題,這幾種技巧的命中率應該不會太低,共享給大家,希望有所幫助。

面試時演算法題的解答思路

面試中純粹考演算法的問題一般是讓很多程式設計師朋友痛恨的,這裡分享下我對於解答演算法題的一些思路和技巧。一般關於演算法的文章,都是從經典演算法講起,一種一種演算法介紹,見得演算法多了,自然就有了感悟,但如此學習花費的時間和精力卻是過於巨大,也不適合在部落格裡面交流。這一篇文,卻是專門講快捷思路的,很...

到Moto面試時一題的解答

到moto面試時一題的解答 黑月亮 發表於 2005 8 7 11 06 00 比較下面兩個函式的異同 1.char func1 void 2.char func2 void 不同點 1.第1個返回的是乙個變數,即結果在以後可修改,如str 0 x 而第2個返回的是乙個常量,即以後不可修改.2.第1...

OA系統面試時如何介紹的思路

面試過程中描述專案一般分為三大點 第一點是參考說辭。後兩點是可補充的說明,個人可根據具體情況介紹 1 專案的開發背景介紹以及個人在專案中完成的功能點 2 專案的開發過程 開發周期 3 專案的系統架構 1 專案開發背景以及個人完成的功能點介紹 我們這個專案是為 公司開發的一套辦公自動化系統,簡稱oa。...