用进制思想解决组合问题

来源:互联网 发布:非网络收音机软件 编辑:程序博客网 时间:2024/06/06 10:49


先对我们要解决的问题进行一个描述:





如上图所示,原来有个字符串”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”这个字符串了。


 


以上就是利用不同为的进制不同,我们用连续的整数编号,来表示每一个组合的结果的方法,具体的代码,以后有时间不上。




0 0
原创粉丝点击