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

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

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

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

    題目大意:輸入一個字符串,顯示出字符串的所有排列。例如:輸入"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ù)組(為了修改其值時互不影響)
                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í)行完畢,跳回上一級循環(huán)(在上一個方法體中)
                }
                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)載請注明出處,謝謝!http://www.tkk7.com/rongxh7(心夢帆影JavaEE技術(shù)博客)
        

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

    評論:
    # 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ù)  更多評論
      
    # re: 舍友筆試中的一道算法題(我的解法) 2010-03-23 10:56 | Grissom
    if the input string contains the redundant char, for example: "aaaa"?
      回復(fù)  更多評論
      
    # 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這樣的字符串,但效率會稍差。
    /*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)境下運行,而且在效率與博主的代碼相差無幾的情況下,可讀性要更好。
      回復(fù)  更多評論
      
    # re: 舍友筆試中的一道算法題(我的解法) 2010-03-23 16:45 | wangkaiyong
    太 厲害了,看了半天才看懂,樓主對遞歸很熟,佩服佩服,有空教教我  回復(fù)  更多評論
      
    # re: 舍友筆試中的一道算法題(我的解法) 2010-03-23 21:36 | sunnycare
    你的算法前提是,字符串沒有重復(fù)字符。  回復(fù)  更多評論
      
    # re: 舍友筆試中的一道算法題(我的解法) 2010-03-24 16:21 | Gauss Reborn
    我寫了個更清晰的算法
    只用了核心代碼3部完成全排列遞歸
    recurrence;
    /*
    * :輸入一個字符串,顯示出字符串的所有排列。例如:輸入"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ù)  更多評論
      
    # re: 舍友筆試中的一道算法題(我的解法) 2010-03-25 20:24 | Lancelot
    @Gauss Reborn
    你的代碼,效率很差,而且與樓主的算法一樣,能不能再提出其他的算法???  回復(fù)  更多評論
      
    # re: 舍友筆試中的一道算法題(我的解法) 2010-03-29 13:51 | nswish
    這類問題一般都是用遞歸來解
    不知道有沒有高手,可以使用非遞歸的方式求解問題  回復(fù)  更多評論
      
    主站蜘蛛池模板: h在线观看视频免费网站| 亚洲精品无码久久久久AV麻豆| 亚洲精品美女久久777777| 最新亚洲人成无码网站| 亚洲一区二区免费视频| 亚洲伊人久久精品影院| 精品亚洲成a人在线观看| 91麻豆最新在线人成免费观看| 亚洲精品国精品久久99热一| 真正全免费视频a毛片| 成人免费午夜视频| 亚洲黄色高清视频| 99久久成人国产精品免费| 免费va人成视频网站全| 亚洲色丰满少妇高潮18p| 亚洲成人在线免费观看| 亚洲色爱图小说专区| 男女男精品网站免费观看 | 亚洲视频免费在线播放| 亚洲AV永久无码精品成人| 乱淫片免费影院观看| 国产成人免费全部网站| 亚洲综合一区无码精品| 亚洲电影免费观看| 久久久久亚洲AV无码观看| 色欲A∨无码蜜臀AV免费播| 亚洲国产精品高清久久久| 本道天堂成在人线av无码免费| 国产一区二区三区免费在线观看| 亚洲日日做天天做日日谢| 国产成人精品久久免费动漫| 中文字幕在线观看亚洲| 日本在线看片免费| 亚洲精品夜夜夜妓女网| 久久www免费人成看国产片| 亚洲午夜精品第一区二区8050| 午夜在线亚洲男人午在线| 精品少妇人妻AV免费久久洗澡| 亚洲三级在线观看| 毛片a级毛片免费观看品善网| 亚洲va在线va天堂成人|