• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            逛奔的蝸牛

            我不聰明,但我會很努力

               ::  :: 新隨筆 ::  ::  :: 管理 ::

            /**

             * 求 N 個元素中 M 個元素的組合算法:

             * 1. 創建一個大小為 N 個元素的數組,前 M 個元素為1,后面的 N-M 個元素為0

             * 2. 從左向右找到 10 的元素(前一個元素是1,下一個元素是0), 交換這兩個元素;

             *    把此元素前面的所有1都移動到數組的最前面,此為一個組合,輸出.

             * 3. 直到前 N-M 個元素都為0,則結束,否則繼續第2步直到結束.

             */

            public class Combinatory {

                public static void produceCombination(String str, int size) {

                    if (size > str.length()) { throw new IllegalArgumentException("Size is to large."); }


                    // 創建一個數組,前size個元素全是1

                    int[] digit = new int[str.length()];

                    for (int i = 0; i < size; ++i) {

                        digit[i] = 1;

                    }


                    // 輸出第一組

                    printCombination(str, digit);


                    while (!end(digit, digit.length - size)) {

                        for (int i = 0; i < digit.length - 1; ++i) {

                            if (digit[i] == 1 && digit[i + 1] == 0) {

                                // i上是1,i + 1是0,交換

                                int temp = digit[i];

                                digit[i] = digit[i + 1];

                                digit[i + 1] = temp;


                                // 移動i前面的所有1到最左端

                                int count = countOf1(digit, i);

                                for (int j = 0; j < count; ++j) {

                                    digit[j] = 1;

                                }


                                for (int j = count; j < i; ++j) {

                                    digit[j] = 0;

                                }


                                printCombination(str, digit);


                                break;

                            }

                        }

                    }

                }


                // 在下標end前1的個數

                private static int countOf1(int[] digit, int end) {

                    int count = 0;

                    for (int i = 0; i < end; ++i) {

                        if (digit[i] == 1) {

                            ++count;

                        }

                    }


                    return count;

                }


                // 數組中為1的下標對應的字符需要輸出

                private static void printCombination(String str, int[] digit) {

                    StringBuffer sb = new StringBuffer();

                    for (int i = 0; i < digit.length; ++i) {

                        if (digit[i] == 1) {

                            sb.append(str.charAt(i));

                        }

                    }


                    System.out.println(sb);

                }


                // 結束條件:前 size 個元素都是0

                private static boolean end(int[] digit, int size) {

                    int sum = 0;


                    for (int i = 0; i < size; ++i) {

                        sum += digit[i];

                    }


                    return sum == 0 ? true : false;

                }


                public static void main(String[] args) {

                    Combinatory.produceCombination("0123456789", 8);

                }

            }


            ===============================================


            import java.util.HashSet;

            import java.util.Set;


            /**

             * 求 N 個元素的全排列算法:

             * 1. 創建一個大小為 N 個元素的數組.

             * 2. 利用 N 進制,滿 N 加 1的原則,對數組的第0個元素加 1,滿 N 了,則下一個元素值加 1.

             * 3. 檢查數組中的元素是否有重復的,如果沒有,則是一個排列.

             * 4. 直到數組中的元素為0, 1, 2, ..., N - 1,則結束,否則繼續第2步直到結束.

             */

            public class Arrangement {

                public static void produceArrangement(String str) {

                    int[] digit = new int[str.length()];

                    int base = str.length();

                    

                    while (!end(digit)) {

                        ++digit[0]; // 第1個元素值加1

                        

                        // 滿N進1

                        for (int i = 0; i < digit.length; ++i) {

                            if (digit[i] == base) {

                                digit[i] = 0;

                                ++digit[i + 1];

                            } else {

                                break;

                            }

                        }

                        

                        if (isArrangement(digit)) {

                            printArrangement(str, digit);

                        }

                    }

                }

                

                // 數組中每個元素都不同,則是排列中的一個

                private static boolean isArrangement(int[] digit) {

                    int sum = 0;

                    int endSum = (0 + digit.length - 1) * digit.length / 2;

                    

                    for (int i = 0; i < digit.length; ++i) {

                        sum += digit[i];

                    }

                    

                    // 為了減少創建Set,所以判斷一下數組中元素的和是不是結束時元素的和,如果是才再繼續判斷.

                    if (sum != endSum) {

                        return false;

                    } else {

                        Set<Integer> is = new HashSet<Integer>();

                        for (int i : digit) {

                            is.add(i);

                        }

                        

                        if (is.size() != digit.length) {

                            return false;

                        } else {

                            return true;

                        }

                    }

                }

                

                private static void printArrangement(String str, int[] digit) {

                    StringBuilder sb = new StringBuilder();

                    for (int i = 0; i < digit.length; ++i) {

                        sb.append(str.charAt(digit[i]));

                    }

                    

                    System.out.println(sb);

                }


                // 如果數組中的元素是 0, 1, 2, ..., digit.length - 1,則結束

                private static boolean end(int[] digit) {

                    for (int i = 0; i < digit.length; ++i) {

                        if (digit[i] != i) {

                            return false;

                        }

                    }

                    

                    return true;

                }

                

                public static void main(String[] args) {

                    Arrangement.produceArrangement("012345");

                }

            }


            ===============================================

            /**

             * 使用遞歸求組合

             * 找到第i個元素后面的count - 1個元素的組合

             */

            import java.util.ArrayList;

            import java.util.Arrays;

            import java.util.Collection;

            import java.util.Iterator;

            import java.util.List;


            public class IterativeCombinatory {

                private List result;

                private String data;


                public IterativeCombinatory(String data, int count) {

                    this.data = data;

                    this.result = new ArrayList();


                    buildCombinatory(0, count);

                }


                // 使用遞歸求組合

                public void buildCombinatory(int index, int count) {

                    for (int i = index; i < data.length(); i++) {

                        result.add("" + data.charAt(i));


                        if (1 == count) {

                            System.out.println(StringUtil.join(result, "+"));

                        } else if (i + 1 < data.length()) {

                            buildCombinatory(i + 1, count - 1); // 在i后面找count-1個的組合

                        }


                        result.remove("" + data.charAt(i)); // 滿足一個后移除最后一個

                    }

                }


                public static void main(String[] args) {

                    String str = "123456";


                    for (int count = 2; count <= str.length(); count++) {

                        new IterativeCombinatory(str, count);

                        System.out.println();

                    }

                }

            }


            class StringUtil {

                public static String join(Object[] arr, String separator) {

                    return join(Arrays.asList(arr), separator);

                }


                public static String join(Collection collection, String separator) {

                    StringBuilder sb = new StringBuilder();

                    separator = separator == null ? "" : separator;


                    Iterator iter = collection.iterator();

                    while (iter.hasNext()) {

                        sb.append(iter.next());

                        if (iter.hasNext()) {

                            sb.append(separator);

                        }

                    }


                    return sb.toString();

                }

            }


             

            posted on 2010-12-24 02:47 逛奔的蝸牛 閱讀(731) 評論(0)  編輯 收藏 引用 所屬分類: Java
            久久久久99精品成人片三人毛片| 人妻无码中文久久久久专区| 久久天堂AV综合合色蜜桃网 | 精品人妻伦一二三区久久| 26uuu久久五月天| 亚洲国产成人精品久久久国产成人一区二区三区综 | 中文成人久久久久影院免费观看| 久久午夜无码鲁丝片| 99久久精品免费看国产一区二区三区 | 久久成人国产精品免费软件| 亚洲中文久久精品无码ww16 | 亚洲一区精品伊人久久伊人| 亚洲AV无码久久精品色欲| 国产69精品久久久久99尤物| 久久久国产精华液| 久久99精品久久久久久9蜜桃| 久久精品国产精品亚洲精品| 久久99精品久久久久久| 久久久久波多野结衣高潮| av无码久久久久久不卡网站| 怡红院日本一道日本久久| 18禁黄久久久AAA片| 91精品国产91热久久久久福利| 久久无码人妻一区二区三区| 要久久爱在线免费观看| 久久精品国产72国产精福利| 久久91精品国产91久久户| 狠狠综合久久综合88亚洲| 久久精品成人欧美大片| 久久免费小视频| 久久综合欧美成人| 国产日产久久高清欧美一区| 色综合久久久久久久久五月| 2019久久久高清456| 精品久久久无码21p发布| 久久久久久精品无码人妻| 亚洲欧美成人久久综合中文网| 欧美与黑人午夜性猛交久久久| 国产高潮国产高潮久久久91 | 国内精品久久国产大陆| 久久天天躁狠狠躁夜夜96流白浆|