求一串字母A B C D取n的所有组合, 如:
当n=2时为:
AB AC AD BC BD CD
有精练代码的,马上给分。

解决方案 »

  1.   

    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;
    }
    }
      

  2.   

    组合....没用缓冲输出,不过数大了,输出也没意义
    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;
    }
    }
      

  3.   

    又是排列组合,给你写一个的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;
        }  
    }