• <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 逛奔的蝸牛 閱讀(730) 評論(0)  編輯 收藏 引用 所屬分類: Java
            久久精品成人国产午夜| 精品国产乱码久久久久久1区2区| 一本久久久久久久| 亚洲香蕉网久久综合影视| 三级三级久久三级久久| yy6080久久| www.久久热| 久久久久亚洲AV成人网| 久久99精品久久久久久野外| 久久天天躁狠狠躁夜夜av浪潮| 一本色道久久综合狠狠躁篇| 人妻丰满AV无码久久不卡 | 久久婷婷五月综合97色一本一本| 久久香综合精品久久伊人| 亚洲一区中文字幕久久| 一本久久a久久精品综合香蕉| 99精品国产99久久久久久97 | 狠狠色婷婷久久一区二区三区| 97久久精品午夜一区二区| 国产日韩久久久精品影院首页| 97精品伊人久久久大香线蕉 | 久久精品夜色噜噜亚洲A∨| 少妇熟女久久综合网色欲| 久久91精品国产91久久户| 久久国产劲爆AV内射—百度| 亚洲国产精品婷婷久久| 久久精品国产亚洲AV蜜臀色欲 | 狠狠88综合久久久久综合网 | 99久久无码一区人妻| 久久亚洲精品国产精品婷婷 | 热re99久久精品国99热| 久久精品免费网站网| 狠狠色丁香久久婷婷综| 久久亚洲国产成人精品性色| 人人狠狠综合88综合久久| 情人伊人久久综合亚洲| 久久精品99久久香蕉国产色戒| 人妻无码精品久久亚瑟影视| 久久婷婷五月综合97色直播| 久久青青草原综合伊人| 久久国产精品99精品国产987|