用進制思想解決組合問題



先對我們要解決的問題進行一個描述:





如上圖所示,原來有個字符串”123”,現在有個對應關係,可以把1換成”A””a”,可以把2換成”B””b”,可以把3換成”C”,那麼,有多少種組合字符串的方式呢(注意順序不變),我們可以計算得到4*3*2 = 24種組合方式(包括原字符串”123”在內)。我們用0~2324個數字來給所有組合的字符串編號,如何根據0~2324個數字,再反過來推出每個數字是對應的哪個字符串呢?下面,詳細說一下方法。


根據上面的描述,我們有以下一直條件:


1.1對應的替換字符是”A”, “a”, “


2.字符串”123”的順序不能改變,也就說,只能替換出來”A2C”這樣的字符串,不能替換出來”2AC”這樣的字符串。


3.對於第一位的字符,”1”, “A”, “a”,”的順序也是固定的,比如第一位的index0的字符是”1”,index1的字符代表”A”, index2的代表”a”, index3的代表字符


 


詳細思路如下:


對於上面這例子,我們可以看成一個三位數,百位是1,十位爲2,個位爲3,這三位的進制是不一樣的,例如,十位的進制是2,百位的進制是6,爲什麼呢,因爲對於十位來說,當個位變化兩次之後,十位就會變化一次。舉個具體的例子


對於字符串”123”的編號就是0,因爲對應的三位數是000,對於字符串”12C”,對應的三位數是001,所以,字符串”12C”的編號是1 字符串”1B3”來說,對應的三位數是010(不要整個看成二進制,雖然這個時候看成二進制也是2,因爲個位數只有兩個變化(”3””C”),所以,010可以看成是001進位之後的結果,這個時候表示的就是2”011”表示字符串”1BC”,根據十位是二進制,所以這個數表示3,下面,出現規律的情況出現了,”0b0”,這個字符串對應的三位數是多少呢?是”020”,因爲十位是2進制,所以020就是2*24“021”對應的是2*2 + 1 =5,下面我們看看百位的進制是多少,我們知道,到021爲止,已經吧十位和個位的所有組合列舉出來了,編號是0~5,總共六個數,所以,百位的進制就是6進制,如下


“100”à對應字符串”A23”,編號是6


“101”à對應的字符串是”A2C”,編號是7


“110”à對應的字符串是”AB3”,編號是8


“111”à對應的字符串是”ABC”,編號是9


“120”à對應字符串是”Ab3”,編號是10


“121”à對應字符串是”AbC”,編號是11


“200”à對應字符串是”a00”,編號是12


……


“321”à對應的字符串是bC”,編號是:3*6 +2*2 + 1*1 = 23


 


 


是不是已經看出來規律了,就是三位數,對應的三個進制,百位乘以6 加上十位乘以2 加上 個位乘以1 的出來的十進制數字就是這個字符串的編號,那麼百位數,十位數,個位數的怎麼填充呢,就是用每位的index來填充。


反過來,如何根據編號,得到對應的字符串,


比如我們需要取出編號爲19的字符串,那麼,我們來看看,怎麼找


我們知道,百位數有四個替換字符,index0~3,百位的進制是6進制,6進制的整數是00乘以6,61乘以6,122乘以6,183乘以6),244乘以6,不過這個case我們沒有百位數是4的結果,)我們先設置百位數,再設置十位數,最後設置個位數,因爲19是大於18的,小於24,所以,百位數是3,19-18還剩下1,顯然十位數應該設置爲0,因爲十位數是要乘以2的,因此個位數設置爲1,拼出來的三位數就是301,取出對應的字符串就是2C”這個字符串了。


 


以上就是利用不同爲的進制不同,我們用連續的整數編號,來表示每一個組合的結果的方法,具體的代碼,以後有時間不上。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章