<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-42  評(píng)論-578  文章-1  trackbacks-0
    我的舍友曉杰(C++高手)今天去了一家IT公司筆面試,其中就有這么一道題。

    題目大意:輸入一個(gè)字符串,顯示出字符串的所有排列。例如:輸入"abc",就得輸出"abc"、"acb"、"bac"、"bca"、"cab"、"cba" 所有可能的序列。

    頗有意義的一道題,我決定用Java語言來寫一寫。代碼如下:
    import java.util.Arrays;
    public class CharList {

        
    //遍歷所有可能的排列結(jié)果
        public static void traversal(char[] chss, int index){
            
    //for循環(huán),從index位置開始向前(向右), index位置的數(shù)與i位置的數(shù)互換
            for(int i = index; i < chss.length; i ++) {
                
    char[] chs = Arrays.copyOf(chss, chss.length);    //Copy出新數(shù)組(為了修改其值時(shí)互不影響)
                char temp = chs[index];
                chs[index] 
    = chs[i];
                chs[i] 
    = temp;
                
    if(index == chs.length-1) {    //到了字符串末, 輸出結(jié)果
                    System.out.println(new String(chs));
                    
    break;    //跟出此次循環(huán), 此traversal方法執(zhí)行完畢,跳回上一級(jí)循環(huán)(在上一個(gè)方法體中)
                }
                traversal(chs, index
    +1);        //遞歸
            }
        }

        
    //Test
        public static void main(String[] args) {
            String str 
    = "abcd";
            
    char[] chs = str.toCharArray();    //轉(zhuǎn)成字符數(shù)組
            traversal(chs, 0);
        }

    }

    程序執(zhí)行,輸出結(jié)果為:
    abcd
    abdc
    acbd
    acdb
    adcb
    adbc
    bacd
    badc
    bcad
    bcda
    bdca
    bdac
    cbad
    cbda
    cabd
    cadb
    cdab
    cdba
    dbca
    dbac
    dcba
    dcab
    dacb
    dabc


    本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處,謝謝!http://www.tkk7.com/rongxh7(心夢(mèng)帆影JavaEE技術(shù)博客)
        

    posted on 2010-03-23 02:04 心夢(mèng)帆影 閱讀(3203) 評(píng)論(8)  編輯  收藏 所屬分類: JavaSE

    評(píng)論:
    # re: 舍友筆試中的一道算法題(我的解法) 2010-03-23 10:50 | ms
    private static List<String> overall(String str){
    List<String> strs = new ArrayList<String>();
    for(int i=0;i<str.length();i++){
    List<String> subStrings = overall(str.substring(0,i)+str.substring(i+1));
    for(String s : subStrings){
    strs.add(str.substring(i,i+1)+s);
    }
    }
    if(str.length()==1){
    strs.add(str);
    }
    return strs;
    }  回復(fù)  更多評(píng)論
      
    # re: 舍友筆試中的一道算法題(我的解法) 2010-03-23 10:56 | Grissom
    if the input string contains the redundant char, for example: "aaaa"?
      回復(fù)  更多評(píng)論
      
    # re: 舍友筆試中的一道算法題(我的解法) 2010-03-23 16:01 | Lancelot
    import java.util.ArrayList;
    import java.util.List;

    import org.apache.commons.lang.ArrayUtils;
    import org.apache.commons.lang.time.StopWatch;

    /*
    * @(#)PermutationAndCombination.java 2010-3-23
    *
    * @COPYRIGHT@
    */

    /**
    * <p>
    * 排列組合
    * </p>
    *
    * @version 1.0
    * @author Lancelot
    *
    */
    public class PermutationAndCombination {

    private char[] resource = new char[0];

    private List resultBuffer = new ArrayList();

    public PermutationAndCombination() {}

    public PermutationAndCombination(char[] resource) {

    this.resource = resource;
    }

    public PermutationAndCombination(String resource) {

    this.resource = resource.toCharArray();
    }

    public List process() {

    for(int i = 0, num = resource.length; i < num; i++) {

    char[] part = ArrayUtils.subarray(resource, i, i + 1);
    char[] tmpResource = ArrayUtils.remove(resource, i);
    permutation(tmpResource, part);
    }

    return resultBuffer;
    }

    private void permutation(char[] resource, char[] prefix) {

    int num = resource.length;
    if( 1 == num ) {

    char[] result = ArrayUtils.addAll(prefix, resource);

    System.out.println(String.valueOf(result));

    //下面的代碼可以解決重復(fù)結(jié)果的問題——比如傳入了aaaa/ aaba這樣的字符串,但效率會(huì)稍差。
    /*String resultString = String.valueOf(result);
    if( !resultBuffer.contains(resultString) ) {
    resultBuffer.add(resultString);
    }*/
    } else {

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

    char[] result = ArrayUtils.add(prefix, resource[i]);

    permutation(ArrayUtils.remove(resource, i), result);
    }
    }
    }

    public static void main(String[] args) {

    StopWatch clock = new StopWatch();
    clock.start();
    System.out.println(new PermutationAndCombination("abcdefge").process());
    clock.stop();
    System.out.println("clock.getTime() => " + clock.getTime());
    }
    }

    這段代碼可在1.3/ 1.4的環(huán)境下運(yùn)行,而且在效率與博主的代碼相差無幾的情況下,可讀性要更好。
      回復(fù)  更多評(píng)論
      
    # re: 舍友筆試中的一道算法題(我的解法) 2010-03-23 16:45 | wangkaiyong
    太 厲害了,看了半天才看懂,樓主對(duì)遞歸很熟,佩服佩服,有空教教我  回復(fù)  更多評(píng)論
      
    # re: 舍友筆試中的一道算法題(我的解法) 2010-03-23 21:36 | sunnycare
    你的算法前提是,字符串沒有重復(fù)字符。  回復(fù)  更多評(píng)論
      
    # re: 舍友筆試中的一道算法題(我的解法) 2010-03-24 16:21 | Gauss Reborn
    我寫了個(gè)更清晰的算法
    只用了核心代碼3部完成全排列遞歸
    recurrence;
    /*
    * :輸入一個(gè)字符串,顯示出字符串的所有排列。例如:輸入"abc",就得輸出"abc"、"acb"、"bac"、"bca"、"cab"、"cba" 所有可能的序列。
    *
    * */
    public class QuanPaiLie {

    public void swap(char[] array,int i,int j){
    char temp = array[i];
    array[i] = array[j];
    array[j]=temp;
    }

    public void compute(char[] array, int pos){
    if(pos == array.length){
    for(char ch:array){
    System.out.print(ch);
    }
    System.out.println();
    }
    for(int i=pos;i<array.length;i++){
    swap(array, i, pos);
    compute(array,pos+1);
    swap(array, pos, i);
    }

    }


    public static void main(String[] args) {
    String input = "abc";
    char[] c = input.toCharArray();
    new QuanPaiLie().compute(c,0);
    }

    }
      回復(fù)  更多評(píng)論
      
    # re: 舍友筆試中的一道算法題(我的解法) 2010-03-25 20:24 | Lancelot
    @Gauss Reborn
    你的代碼,效率很差,而且與樓主的算法一樣,能不能再提出其他的算法???  回復(fù)  更多評(píng)論
      
    # re: 舍友筆試中的一道算法題(我的解法) 2010-03-29 13:51 | nswish
    這類問題一般都是用遞歸來解
    不知道有沒有高手,可以使用非遞歸的方式求解問題  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 一级毛片aa高清免费观看| 亚洲大尺度无码专区尤物| 亚洲av日韩av无码av| 亚洲综合免费视频| 亚洲最新黄色网址| 久久天天躁狠狠躁夜夜免费观看 | 久久精品一区二区免费看| 在线精品亚洲一区二区三区| 成人久久久观看免费毛片| 免费一区二区三区四区五区| 羞羞漫画在线成人漫画阅读免费| 国产免费69成人精品视频| 四虎影视永久在线精品免费| 亚洲伊人成无码综合网 | 久久久99精品免费观看| 亚洲激情在线视频| 天天影视色香欲综合免费| 国产精品亚洲精品青青青| 日韩中文无码有码免费视频| 成人嫩草影院免费观看| 亚洲乱码国产乱码精品精| 四虎国产成人永久精品免费| 亚洲伊人久久精品| 免费国产a国产片高清网站| 久久国产美女免费观看精品| 亚洲AV无码久久精品色欲| www.黄色免费网站| 婷婷亚洲综合五月天小说在线| 红杏亚洲影院一区二区三区| 8x8×在线永久免费视频| 亚洲最大的成人网| 亚洲日韩欧洲乱码AV夜夜摸| 亚洲免费人成视频观看| 国产精品亚洲天堂| 亚洲Av无码专区国产乱码DVD| 毛片免费全部免费观看| 一级成人a做片免费| 亚洲国产日产无码精品| 内射无码专区久久亚洲| 91成人在线免费视频| 色欲aⅴ亚洲情无码AV蜜桃|