import java.util.LinkedList; import java.util.List; public class test { public static void main(String[] args) { List<String> list = calc(3); while (!list.isEmpty()) { String s = list.remove(0); System.out.println(s); } }
public static List<String> calc(int n){ List<String> list = null; if (n < 1) { list = null; } else if (n == 1) { list = new LinkedList<String>(); list.add("A"); list.add("B"); list.add("C"); list.add("D"); } else { list = calc(n - 1); int size = list.size(); for (int i = 0; i < size; i++) { String s = list.remove(0); if (!s.contains("A")) list.add(s + "A"); if (!s.contains("B")) list.add(s + "B"); if (!s.contains("C")) list.add(s + "C"); if (!s.contains("D")) list.add(s + "D"); } }
return list; } }
组合....没用缓冲输出,不过数大了,输出也没意义 public class Combination { private int[] maskI; private int[] maskD; static int countNum = 0; private char[] charArray; private int n;
private char[] buffer; public static void main(String[] args) { long start = System.currentTimeMillis();
String s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char[] charArray = s.toCharArray();
Combination c = new Combination(charArray); c.get(4);
long end = System.currentTimeMillis(); System.out.println(countNum); System.out.println(end - start); } public Combination(char[] charArray) { this.charArray = charArray; n = charArray.length; initMask(n); } public void get(int r) { buffer = new char[r]; int temp = (1 << r) - 1; while (temp != 0) { countNum++; convert(temp); temp = find1to0(temp, n); } } private void convert(int temp) { int count = 0; for (int i = 0; i < n; i++) { if ((temp & (1 << i)) != 0) { buffer[count] = charArray[i]; count++; } } System.out.println(new String(buffer)); } // 初始化mask private void initMask(int n) { maskI = new int[n]; maskD = new int[n]; int j = 0; int k = (1 << n) - 1; for (int i = 0; i < n; i++) { maskI[i] = j; maskD[i] = k - maskI[i]; j <<= 1; j++; } } /* * 找num的二进制中1到0的变化(右到左)的位置,然后交换01为10, 然后把其右面的1全部右移到头 C,7,4为例 0 maskI: * 0000000 maskD: 1111111 1 0000001 1111110 2 0000011 1111100 3 0000111 * 1111000 4 0001111 1110000 5 0011111 1100000 6 0111111 1000000 * * num: 0001111 找到1到0的变化后,i是4, count是4, j是0010000 0001111 | j 0010000 * --------------------- 0011111 &maskD4 1110000 --------------------- * 0010000 |maskI3 0000111 --------------------- 0010111 */ private int find1to0(int num, int n) { boolean flag = false; int count = 0; int j = 1; for (int i = 0; i < n; i++) { int temp = num & j; if (temp == 0) { if (flag == true) { return (num | j) & maskD[i] | maskI[count - 1]; } } else { count++; if (flag == false) flag = true; } j <<= 1; } return 0; } }
又是排列组合,给你写一个的sample,关键是combine方法import java.util.Arrays; import java.util.Vector; public class Combine { public static void main(String[] args) { try { String[] a = {"A", "B", "C", "D"}; String[][] result = combine(a, 2); for (int i=0; i<result.length; i++) { for (int j=0; j<result[i].length-1; j++) { System.out.print(result[i][j]); } System.out.println(result[i][result[i].length-1]); } } catch (Throwable e) { e.printStackTrace(); } }
private static String[][] combine(String[] src, int n) { if (src.length < n) { return new String[0][0]; }
if (n == 1) { String[][] result = new String[src.length][1]; for (int i=0; i<src.length; i++) { result[i][0] = src[i]; } return result; }
if (src.length == n) { String[][] result = new String[1][src.length]; for (int i=0; i<src.length; i++) { result[0][i] = src[i]; } return result; } Vector v = new Vector(); for (int i=0; i<src.length-1; i++) { String[] sub = new int[src.length-i-1]; System.arraycopy(src, i+1, sub, 0, src.length-i-1); if (sub.length < n-1) { break; } String[][] tmp = combine(sub, n-1, sort); for (int j=0; j<tmp.length; j++) { String[] tmp2 = new String[n]; System.arraycopy(tmp[j], 0, tmp2, 1, n-1); tmp2[0] = src[i]; v.add(tmp2); } }
String[][] result = new String[v.size()][n]; System.arraycopy(v.toArray(), 0, result, 0, v.size()); return result; } }
import java.util.List;
public class test {
public static void main(String[] args) {
List<String> list = calc(3);
while (!list.isEmpty()) {
String s = list.remove(0);
System.out.println(s);
}
}
public static List<String> calc(int n){
List<String> list = null;
if (n < 1) {
list = null;
} else if (n == 1) {
list = new LinkedList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
} else {
list = calc(n - 1);
int size = list.size();
for (int i = 0; i < size; i++) {
String s = list.remove(0);
if (!s.contains("A"))
list.add(s + "A");
if (!s.contains("B"))
list.add(s + "B");
if (!s.contains("C"))
list.add(s + "C");
if (!s.contains("D"))
list.add(s + "D");
}
}
return list;
}
}
public class Combination { private int[] maskI; private int[] maskD; static int countNum = 0; private char[] charArray; private int n;
private char[] buffer; public static void main(String[] args) {
long start = System.currentTimeMillis();
String s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char[] charArray = s.toCharArray();
Combination c = new Combination(charArray);
c.get(4);
long end = System.currentTimeMillis();
System.out.println(countNum);
System.out.println(end - start);
} public Combination(char[] charArray) {
this.charArray = charArray;
n = charArray.length;
initMask(n);
} public void get(int r) {
buffer = new char[r];
int temp = (1 << r) - 1;
while (temp != 0) {
countNum++;
convert(temp);
temp = find1to0(temp, n);
}
} private void convert(int temp) {
int count = 0;
for (int i = 0; i < n; i++) {
if ((temp & (1 << i)) != 0) {
buffer[count] = charArray[i];
count++;
}
}
System.out.println(new String(buffer));
} // 初始化mask
private void initMask(int n) {
maskI = new int[n];
maskD = new int[n];
int j = 0;
int k = (1 << n) - 1;
for (int i = 0; i < n; i++) {
maskI[i] = j;
maskD[i] = k - maskI[i];
j <<= 1;
j++;
}
} /*
* 找num的二进制中1到0的变化(右到左)的位置,然后交换01为10, 然后把其右面的1全部右移到头 C,7,4为例 0 maskI:
* 0000000 maskD: 1111111 1 0000001 1111110 2 0000011 1111100 3 0000111
* 1111000 4 0001111 1110000 5 0011111 1100000 6 0111111 1000000
*
* num: 0001111 找到1到0的变化后,i是4, count是4, j是0010000 0001111 | j 0010000
* --------------------- 0011111 &maskD4 1110000 ---------------------
* 0010000 |maskI3 0000111 --------------------- 0010111
*/
private int find1to0(int num, int n) {
boolean flag = false;
int count = 0;
int j = 1;
for (int i = 0; i < n; i++) {
int temp = num & j;
if (temp == 0) {
if (flag == true) {
return (num | j) & maskD[i] | maskI[count - 1];
}
} else {
count++;
if (flag == false)
flag = true;
}
j <<= 1;
}
return 0;
}
}
import java.util.Vector;
public class Combine {
public static void main(String[] args) {
try {
String[] a = {"A", "B", "C", "D"};
String[][] result = combine(a, 2);
for (int i=0; i<result.length; i++) {
for (int j=0; j<result[i].length-1; j++) {
System.out.print(result[i][j]);
}
System.out.println(result[i][result[i].length-1]);
} } catch (Throwable e) {
e.printStackTrace();
}
}
private static String[][] combine(String[] src, int n) {
if (src.length < n) {
return new String[0][0];
}
if (n == 1) {
String[][] result = new String[src.length][1];
for (int i=0; i<src.length; i++) {
result[i][0] = src[i];
}
return result;
}
if (src.length == n) {
String[][] result = new String[1][src.length];
for (int i=0; i<src.length; i++) {
result[0][i] = src[i];
}
return result;
} Vector v = new Vector();
for (int i=0; i<src.length-1; i++) {
String[] sub = new int[src.length-i-1];
System.arraycopy(src, i+1, sub, 0, src.length-i-1);
if (sub.length < n-1) {
break;
}
String[][] tmp = combine(sub, n-1, sort);
for (int j=0; j<tmp.length; j++) {
String[] tmp2 = new String[n];
System.arraycopy(tmp[j], 0, tmp2, 1, n-1);
tmp2[0] = src[i];
v.add(tmp2);
}
}
String[][] result = new String[v.size()][n];
System.arraycopy(v.toArray(), 0, result, 0, v.size());
return result;
}
}