4個簡單算法題的思考

最近遇見兩個算法題,當時沒有想到比較好的辦法,第二天在公交上思考了一下,感覺像是比較不錯的解題方法,今天記錄一下。公交車是一個不錯的思考場所!


一、有一個數組,長度為n,其中有若干個0,且不知道這些0所在的數組下標。要求:在不能開辟另外數組的情況下,用最少的空間復雜度和時間復雜度把所有的0排到最后去,且原來的非零數前后順序不變。

我一開始的思路是記錄0的個數x,遍歷數組,找0便把后面的所有數往前挪一位,然后把數組最后一個元素賦值為0,x+1。接著再找,找到第二個0,繼續把后面的往前挪,然后把數組倒數第二個元素賦值為0,x+1。繼續此方法,直至遍歷到下標為 n - x - 2 的元素。想想效率太差了,最差的情況下要交換 ?(n - 1 +1) / 2 * (n - 1)次,時間復雜度為O(n2),空間復雜度為O(0)拙劣的思考。

后面我思考到了一個比較不錯的方法:遍歷數組,找到0之后記錄該元素的下標index,繼續往后遍歷,找到第一個非零元素(因為0后面可能又接著是0),讓該元素和下標為index的元素交換,接著做index++;繼續往后遍歷,找到接下來的第一個非零元素,讓該元素和下標為index的元素交換,接著做index++......一直繼續執行該操作至遍歷到數組最后一個元素,大功告成!最差的情況下要交換n - 1 次,時間復雜度為O(n),比之前思考的那一個方法快了一個指數級。

這個問題我優化到這里了,希望大家可以思考到更好的方法。


二、甲上樓需要走20個階梯,每次可能走1步,也可能走2步。問有多少種走法?

我一開始的思路是排列組合里面的捆綁。拆解:1、假設沒有走兩步,那么便是1種走法。2、假設只走了一次兩步,那么把這兩步捆綁在一起,插在其它18步的任意一步的前面后者后面,那么總共有19種走法。3、假設走了兩次兩步,捆綁插入那么便是17 * 18 / 2種走法。。。繼續算下去至走了十次兩步。乍一看我這個方法還不錯,解決了問題,也能算出正確答案,但是有兩個缺點。缺點1:容易算錯,公式要用的比較細心。缺點2:如果題目是可能走1步,2步,也可能是3步,或者4步,那我這解法就要弄得更復雜才能解決這問題了。不能靈活變化的解法都不是好解法。

好解法當然還是有的,有人提醒我可以用動態規劃,其實它是一個斐波那契數列的應用。

原來如此!20步可能是19步+1步,也可能是18步+2步。那么f(20) = f(19) + f(18),我只要算19步的走法數加上18步的走法數就好了,而f(19) = f(18) + f(17),所以f(20) =?f(18) + f(17) +?f(18),繼續遞歸到右邊的式子都是f(2) 和f(1),那么問題也就只是個加法運算了。如果有走3步的可能,也同樣可以使用該方法。


三、有15個瓶子,其中最多有一瓶有毒,現在有四只老鼠,老鼠喝了有毒的水之后第二天就會死。如何在第二天就可以判斷出哪個瓶子有毒?

這個看到15瓶就知道怎么做了,最多一瓶有毒,所以共15+1=16種結果,而有4老鼠,用排列組合算一下就OK了。把老鼠編號A、B、C、D,把水編號1、2、3、4....14、15。解決方法:把1給A喝,2給B喝,3給C喝,4給D喝,5給A和B喝,6給A和C喝,7給A和D...10給C和D,11給A、B、C喝...14給B、C、D喝,15給所有老鼠都喝。

毒死1只老鼠:共4種。比如D死則4號水有毒。

毒死2只老鼠:共6種。比如A和D死則7號水有毒。

毒死3只老鼠:共4種。比如B、C、D死則14號水有毒。

毒死4只老鼠:共1種。15號水有毒。

毒死0只老師,共1種,也就是所有水都沒毒。

根據毒死的結果就可以知道是哪瓶有毒了。


四、給定能隨機生成整數 1 到 5 的函數,寫出能隨機生成整數 1 到 7 的函數。

看到題目是挺懵逼的,思考了很久想了一個答案,但沒有完美解決這個問題。

5的冪都不能被7整除,所以只能曲線救國。f(a) =?random(5)* ?5 -?random(5)+1 可以得到1-25的25個數其中的一個a,所有結果出現的概率相等。如果a是前面21個數除以3分別可以得到0-6其中的一個,如果是22-25中的其中一個,則再做一次f(a),再用剛才的判斷方法進行后續的步驟。

記錄到這里,加油!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容