算法描述:
算法說(shuō)明:當(dāng)n大于2時(shí),n個(gè)數(shù)的全組合一共有(2^n)-1種扒吁。
當(dāng)對(duì)n個(gè)元素進(jìn)行全組合的時(shí)候火鼻,可以用一個(gè)n位的二進(jìn)制數(shù)表示取法室囊。
1表示在該位取,0表示不取魁索。例如融撞,對(duì)ABC三個(gè)元素進(jìn)行全組合, 100表示取A粗蔚,010表示取B尝偎,001表示取C,101表示取AC 110表示取AB鹏控,011表示取BC致扯,111表示取ABC
注意到表示取法的二進(jìn)制數(shù)其實(shí)就是從1到7的十進(jìn)制數(shù)
推廣到對(duì)n個(gè)元素進(jìn)行全排列,取法就是從1到2^n-1的所有二進(jìn)制形式
要取得2^n当辐,只需將0xFFFFFFFF左移32-n位抖僵,再右移回來(lái)就可以了。
算法實(shí)現(xiàn):
package com.set.test;
public class SetTest {
public static void main(String[] args) {
String str[] = { "A", "B", "C", "D", "E" };
int nCnt = str.length;
int nBit = (0xFFFFFFFF >>> (32 - nCnt));
for (int i = 1; i <= nBit; i++) {
for (int j = 0; j < nCnt; j++) {
if ((i << (31 - j)) >> 31 == -1) {
System.out.print(str[j]);
}
}
System.out.println("");
}
}
}