漫画:什么是字典序算法
轉(zhuǎn)載自?漫畫:什么是字典序算法?
算法題目:
給定一個(gè)正整數(shù),實(shí)現(xiàn)一個(gè)方法來求出離該整數(shù)最近的大于自身的“換位數(shù)”。
什么是換位數(shù)呢?就是把一個(gè)整數(shù)各個(gè)數(shù)位的數(shù)字進(jìn)行全排列,從而得到新的整數(shù)。例如53241和23541。
小灰也不知道這種經(jīng)過換位的整數(shù)應(yīng)該如何稱呼,所以姑且稱其為“換位數(shù)”。
題目要求寫一個(gè)方法來尋找最近的且大于自身的換位數(shù)。比如下面這樣:
輸入12345,返回12354
輸入12354,返回12435
輸入12435,返回12453
小灰發(fā)現(xiàn)的“規(guī)律”:
輸入12345,返回12354
12354 - 12345 =?9
剛好相差9的一次方
輸入12354,返回12435
12435 - 12354 =?81
剛好相差9的二次方
所以,每次計(jì)算最近的換位數(shù),只需要加上9的N次方即可?
————————————
舉一個(gè)栗子:
給定1,2,3,4,5這幾個(gè)數(shù)字。
最大的組合:54321
最小的組合:12345
比如給定整數(shù)12354,如何找到離它最近且大于它的換位數(shù)呢?
為了和原數(shù)接近,我們需要盡量保持高位不變,低位在最小的范圍內(nèi)變換順序。
那么,究竟需要變換多少位呢?這取決于當(dāng)前整數(shù)的逆序區(qū)域。
如果所示,12354的逆序區(qū)域是最后兩位,僅看這兩位已經(jīng)是當(dāng)前的最大組合。若想最接近原數(shù),又比原數(shù)更大,必須從倒數(shù)第3位開始改變。
怎樣改變呢?12345的倒數(shù)第3位是3,我們需要從后面的逆序區(qū)域中尋找到剛剛大于3的數(shù)字,和3的位置進(jìn)行互換:
互換后的臨時(shí)結(jié)果是12453,倒數(shù)第3位已經(jīng)確定,這時(shí)候最后兩位仍然是逆序狀態(tài)。我們需要把最后兩位轉(zhuǎn)變回順序,以此保證在倒數(shù)第3位數(shù)值為4的情況下,后兩位盡可能小:
這樣一來,我們就得到了想要的結(jié)果12435。
獲得最近換位數(shù)的三個(gè)步驟:
1.從后向前查看逆序區(qū)域,找到逆序區(qū)域的前一位,也就是數(shù)字置換的邊界
2.把逆序區(qū)域的前一位和逆序區(qū)域中剛剛大于它的數(shù)字交換位置
3.把原來的逆序區(qū)域轉(zhuǎn)為順序
這種解法擁有一個(gè)高大上的名字:字典序算法。
幾點(diǎn)補(bǔ)充:
本漫畫純屬娛樂,還請大家盡量珍惜當(dāng)下的工作,切勿模仿小灰的行為哦。
總結(jié)
以上是生活随笔為你收集整理的漫画:什么是字典序算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCP接入层的负载均衡、高可用、扩展性架
- 下一篇: 分布式一致性算法:可能比你想象得更复杂