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

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

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

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

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

          }

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


          本文原創,轉載請注明出處,謝謝!http://www.aygfsteel.com/rongxh7(心夢帆影JavaEE技術博客)
              

          posted on 2010-03-23 02:04 心夢帆影 閱讀(3216) 評論(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;
          }  回復  更多評論
            
          # re: 舍友筆試中的一道算法題(我的解法) 2010-03-23 10:56 | Grissom
          if the input string contains the redundant char, for example: "aaaa"?
            回復  更多評論
            
          # 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));

          //下面的代碼可以解決重復結果的問題——比如傳入了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的環境下運行,而且在效率與博主的代碼相差無幾的情況下,可讀性要更好。
            回復  更多評論
            
          # re: 舍友筆試中的一道算法題(我的解法) 2010-03-23 16:45 | wangkaiyong
          太 厲害了,看了半天才看懂,樓主對遞歸很熟,佩服佩服,有空教教我  回復  更多評論
            
          # re: 舍友筆試中的一道算法題(我的解法) 2010-03-23 21:36 | sunnycare
          你的算法前提是,字符串沒有重復字符。  回復  更多評論
            
          # 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);
          }

          }
            回復  更多評論
            
          # re: 舍友筆試中的一道算法題(我的解法) 2010-03-25 20:24 | Lancelot
          @Gauss Reborn
          你的代碼,效率很差,而且與樓主的算法一樣,能不能再提出其他的算法???  回復  更多評論
            
          # re: 舍友筆試中的一道算法題(我的解法) 2010-03-29 13:51 | nswish
          這類問題一般都是用遞歸來解
          不知道有沒有高手,可以使用非遞歸的方式求解問題  回復  更多評論
            
          主站蜘蛛池模板: 普格县| 莆田市| 汉源县| 北海市| 湘阴县| 瑞安市| 西充县| 葵青区| 长子县| 湘潭县| 嘉鱼县| 安宁市| 庆阳市| 兴仁县| 绥德县| 刚察县| 昌图县| 普陀区| 花莲县| 柯坪县| 巴塘县| 洞口县| 介休市| 延庆县| 柘城县| 清水河县| 盐山县| 丰宁| 郓城县| 建德市| 南郑县| 商水县| 麟游县| 文水县| 四川省| 玛曲县| 平和县| 宣汉县| 象州县| 赤水市| 稻城县|