自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

程序員須知之面試時算法題的解答思路

運維 數(shù)據(jù)庫運維 算法
面試中純粹考算法的問題一般是讓很多程序員朋友痛恨的,這里分享下我對于解答算法題的一些思路和技巧。

面試中純粹考算法的問題一般是讓很多程序員朋友痛恨的,這里分享下我對于解答算法題的一些思路和技巧。

一般關(guān)于算法的文章,都是從經(jīng)典算法講起,一種一種算法介紹,見得算法多了,自然就有了感悟,但如此學(xué)習(xí)花費的時間和精力卻是過于巨大,也不適合在博客里面交流。這一篇文,卻是專門講快捷思路的,很多人面對算法題的時候幾乎是腦子里一片空白,這一篇文章講的就是從題目下手,把毫無思路的題目打開一個缺口的幾種常見技巧。

 

(一)由簡至繁

事實上,很多問題確實是很難在***時間內(nèi)得到正確的思路的,這時候可以嘗試一種由簡至繁的思路。首先把問題規(guī)??s小到非常容易解答的地步。

[題目]有足夠量的2分、5分、1分硬幣,請問湊齊1元錢有多少種方法?

此題乍看上去,只會覺得完全無法入手,但是按照由簡至繁的思路,我們可以先考慮極端簡單的情況,假如把問題規(guī)??s小成:有足夠量的1分硬幣,請問湊齊1分錢有多少種方法?毫無疑問,答案是1。

得到這一答案之后,我們可以略微擴大問題的規(guī)模: 有足夠量的1分硬幣,湊齊2分錢有多少種方法?湊齊n分錢有多少種方法?答案仍然是1

接下來,我們可以從另一個角度來擴大問題,有足夠量的1分硬幣和2分硬幣,湊齊n分錢有多少種方法?這時我們手里已經(jīng)有了有足夠量的1分硬幣,湊齊任意多錢都只有1種方法,那么只用1分錢湊齊n-2分錢,有1種方法,只用1分錢湊齊n-4分錢,有1種方法,只用1分錢湊齊n-6分錢,有1種方法......

而湊齊這些n-2、n-4、n-6這些錢數(shù),各自補上2分錢,會產(chǎn)生一種新的湊齊n分錢的方法,這些方法的總數(shù)+1,就是用1分硬幣和2分硬幣,湊齊n分錢的方法數(shù)了。

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

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

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

 

(二)一分為二

另一種思路,就是把問題一刀斬下,把問題分為兩半,變成兩個與原來問題同構(gòu)的問題,能把問題一分為2,就能再一分為4,就能再一分為8,直到分成我們?nèi)菀捉鉀Q的問題。當(dāng)嘗試這種思路時,其實只需要考慮兩個問題:1.一分為二以后,問題是否被簡化了? 2.根據(jù)一分為二的兩個問題的解,能否方便地得出整個問題的解?

[題目]將一個數(shù)組排序。

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

最簡單的一分為二,就是將數(shù)組分成兩半,分別排序。對于兩個有序數(shù)組,我們有辦法將它合并成一個有序數(shù)組,所以這個一分為二的思路是可行的,同樣對于已經(jīng)分成兩半的數(shù)組,我們還可以將這個數(shù)組分作兩半,直到我們分好的數(shù)組僅有1個元素,1個元素的數(shù)組天然就是有序的。不難看出,按這種思路我們得出的是經(jīng)典數(shù)組排序算法中的“歸并排序”。

還有另一種一分為二的思路,考慮到自然將數(shù)組分成兩半合并起來比較復(fù)雜,我們可以考慮將數(shù)組按照大于和小于某個元素分成兩半,這樣只要分別解決就可以直接連接成一個有序數(shù)組了,同樣這個問題也是能夠再次一分為二。按照這個思路,則可以得出經(jīng)典數(shù)組排序算法中的“快速排序”。

 

(三)化虛為實

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

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

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

 

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

原文鏈接:http://www.cnblogs.com/winter-cn/archive/2011/03/01/1960267.html

【編輯推薦】

  1. Python算法正確實現(xiàn)方式介紹
  2. 圖解JVM分代垃圾回收流程與算法的選擇
  3. PHP遞歸算法的詳細示例分析
  4. VB.NET編碼算法學(xué)習(xí)筆記
  5. 三種常用C#排序算法
責(zé)任編輯:艾婧 來源: 博客園
相關(guān)推薦

2021-06-21 07:44:07

程序員面試職場

2018-06-27 13:10:22

程序員面試易犯錯誤

2013-01-10 09:22:58

程序員面試程序員面試經(jīng)歷

2012-08-23 09:44:32

面試面試題算法

2015-08-27 16:15:10

程序員面試錯誤

2018-12-07 15:30:29

程序員面試項目經(jīng)驗

2020-05-22 16:47:38

程序員技術(shù)互聯(lián)網(wǎng)

2009-02-27 10:30:09

面試聯(lián)想智力

2022-03-21 15:30:27

面試程序員算法

2019-06-04 16:20:42

2015-06-24 09:41:23

Java面試經(jīng)典算法題

2014-02-13 15:38:13

程序員算法面試

2015-06-29 09:44:55

2014-06-20 16:16:32

程序員算法

2011-01-13 09:40:23

算法

2015-03-06 10:10:18

程序員基礎(chǔ)實用算法講解

2010-12-23 15:45:31

程序員編程

2014-05-15 16:20:26

iOS程序員Android要點

2014-07-15 15:38:41

Android

2010-08-10 16:21:48

面試薪資
點贊
收藏

51CTO技術(shù)棧公眾號