Given a list of non negative integers, arrange them such that they form the largest number.
For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.
Note: The result may be very large, so you need to return a string instead of an integer.
s思路: 1. 正如我所理解。需要排序。例如:[3, 30, 34, 5, 9],先把所有數(shù)變成string,然后排序:從左邊起逐位比較,如果相等,則都移動(dòng)到右邊一位比較,這都很平常。有趣的一點(diǎn)是,3和30比較,第0位同為3,相等,但是3只有一位不能再往右移動(dòng)了,此時(shí)就不移動(dòng),而只移動(dòng)30的指針到0,比較3和0。也就是說(shuō)移動(dòng)受到邊界的限制,只是這里處理邊界的方法是停留在邊界處,并取邊界值比較。再比如:3和34,那3就會(huì)和4比較,發(fā)現(xiàn)4>3,所以34比3大,因?yàn)?4如果放在3前面組成343比34放在3后面組成的334大。(刪除的部分不正確) 2. debug了好久,重新來(lái)說(shuō)。有很多case,例如:3和34比較,可以認(rèn)為3這個(gè)數(shù)停在這個(gè)位置上了,但是這么特殊的一個(gè)例子,3只有一位,怎么看的出來(lái)規(guī)律呢,所以問(wèn)題是被簡(jiǎn)化了,顯然自己沒(méi)看到更general的case。例如,824和8247,當(dāng)824的指針移動(dòng)到4時(shí),下一刻應(yīng)該去向何處?應(yīng)該把8247的7和824的8比較才對(duì)呀,我馬上結(jié)論說(shuō)那就是到了結(jié)尾后下一步就再取開(kāi)頭的數(shù)比較。再例如,323和3233比較,當(dāng)走到323結(jié)尾的3時(shí),下一刻如果回到開(kāi)頭的3,那么3233也是3,難道這兩個(gè)數(shù)怎么放都可以嗎?顯然323+3233<3233+323,所以還是不對(duì),不過(guò)結(jié)合上一次的教訓(xùn),應(yīng)該不用急著全盤(pán)否定這種做法,可能我們離正確的做法又近了!既然323遍歷到最右邊數(shù)之后還要回到最左邊數(shù)繼續(xù)比較,那么3233也可以啊,當(dāng)我們3233到了最右邊的3,下一步不是跳出循環(huán),而是繼續(xù)回到最左邊數(shù),所以:3233的第一個(gè)數(shù)3和323的第二個(gè)數(shù)2比較,這不,馬上就可以看出大小!到這里,自然想到,如果是333和3333比較,結(jié)果肯定是相等,所以兩個(gè)數(shù)循環(huán)多少次都不可能不相等,因此必須又一個(gè)stopping rule,那就是最長(zhǎng)的數(shù)的長(zhǎng)度的兩倍(后來(lái)又進(jìn)一步縮小范圍,stopping條件是循環(huán)次數(shù)是兩個(gè)數(shù)的長(zhǎng)度之和)即:3333循環(huán)兩次還是相等,那就真的相等,這時(shí)候就需要跳出while。 3. 這里思維的進(jìn)步,需要單獨(dú)提一下。昨天 Leetcode 165. Compare Version Numbers的時(shí)候,就把比較放在while內(nèi)和while外到處都是,一點(diǎn)沒(méi)打包嚴(yán)實(shí),不光思路不清,debug也不易,最后把比較功能都想辦法塞進(jìn)while內(nèi),世界一下美好了!今天剛開(kāi)始也出現(xiàn)過(guò),沒(méi)多想就把比較不等的放在while內(nèi),比較相等的又放在while外。不過(guò)昨天的記錄,今天腦子馬上就冒出一個(gè)聲音說(shuō)要想辦法把兩部分的代碼都塞進(jìn)while里面,果然就簡(jiǎn)單很多,而且最后beat 96%. 4. 補(bǔ)充一點(diǎn),題做多了,和以前僵硬的思路比,現(xiàn)在思維更靈活了,思維的訓(xùn)練和肌肉的訓(xùn)練很相似,或者說(shuō)這兩者本就沒(méi)什么差別,尤其是自己嘗試每天去捕捉思維的形狀。越是去觀察思維的樣子,思維反倒容易放松,也就越容易reshape,而那些批評(píng)自我羨慕別人并不能讓自己思維變化,反而徒增煩惱。就拿這道題說(shuō),剛開(kāi)始有很大一部分是連蒙帶猜的,想到兩個(gè)指針到結(jié)尾時(shí)仍相等怎么辦時(shí),就思維幾乎停在這個(gè)問(wèn)題,沒(méi)有自然而然或努力嘗試去深入思考這個(gè)問(wèn)題,而是找了兩個(gè)特殊的簡(jiǎn)單的例子觀察得出一個(gè)簡(jiǎn)化的方法,沒(méi)有搞清楚為什么。整個(gè)思維過(guò)程就是這樣子,后來(lái)debug把復(fù)雜的case拿出來(lái)一研究才發(fā)現(xiàn)兩個(gè)指針應(yīng)該循環(huán)往復(fù),問(wèn)題一下就有趣了些。 5. 這道題反映的思維的短板在哪兒呢?還要說(shuō)兩個(gè)指針到尾巴后如何處理的事,自己給自己的選項(xiàng)就是試圖簡(jiǎn)化答案,比如就停在尾巴,或回到開(kāi)頭停下。試圖讓指針停在某一個(gè)具體的位置,本身這個(gè)答案就沒(méi)有新意,停在一個(gè)地方,而不動(dòng)起來(lái),說(shuō)明思維或者自己潛意識(shí)在圖省事,怕麻煩,都不愿意讓指針動(dòng)起來(lái)。指針不動(dòng),那腦子當(dāng)然也動(dòng)不了,這就expose思維僵化的一瞬間。當(dāng)然,最后能打破思維的靜態(tài)和慣性,讓指針繼續(xù)循環(huán)動(dòng)起來(lái),說(shuō)明腦子里本來(lái)就有動(dòng)的不僵化的一面,只是被這個(gè)強(qiáng)大的僵化的思維給覆蓋了! 6. 看了網(wǎng)上答案,這個(gè)題還有一個(gè)代碼和理解起來(lái)都很容易的做法:如何判斷a和b誰(shuí)應(yīng)該放在前面的問(wèn)題?比較a+b和b+a看誰(shuí)更大,這個(gè)比較直接用string的比較就可以了,因此最后還是一個(gè)簡(jiǎn)潔的數(shù)學(xué)題,不過(guò)這個(gè)方法每次都要concatenate兩個(gè)string,比較費(fèi)時(shí)間! 7. 再思考一下,這個(gè)數(shù)學(xué)的方法是怎么想到的?自己想到的方法是深入細(xì)節(jié),挑戰(zhàn)各路extreme case,而且最終也在各路細(xì)節(jié)中摸爬滾打出一條正確的方式—循環(huán)指針,一言以蔽之,自己的方法是bottom-up,希望從底層往上解決問(wèn)題;而利用數(shù)學(xué)的方法,思考就不是從細(xì)節(jié)入手了,而從系統(tǒng)出發(fā),從頂層設(shè)計(jì)入手,是一種top-down的方法。兩種方法各有優(yōu)勢(shì),不必厚此薄彼。數(shù)學(xué)的方法,是一眼能看到10里的人容易想出來(lái)的;從底層入手的,對(duì)抗各路limit case的適合一眼能看到1里的人容易想到了,屬于不同世界的人看世界的角度。也不是說(shuō)世界不同,是處在世界的位置不同,一眼能看10里,那是因?yàn)閯e人站在數(shù)學(xué)的高度看了,所以眼里就是公式,如何用公式把世界給完美的模擬;一眼看1里,沒(méi)有數(shù)學(xué)這棟高樓,就只能泥地里打滾,combat艱難的各路case。多從數(shù)學(xué)的角度出發(fā),尤其是發(fā)現(xiàn)目前腦袋里冒出來(lái)的方法要面臨很多瑣碎的extreme case時(shí)!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注