一道递归算法--String[] 里面的字符无重复的排序

用java把1234各种排序都打印出来,如:1234,1243,1324,1342...(Hint:深度排序算法)。

面试时哪晓得深度什么子的,就直接用Arrays.asList返回的List的remove方法(当然,这是错的;Arrays.asList()返回的List是长度一定的,不能remove,抛出unsupportoperation异常)。上网看了看深度排序算法,终于实现了,现贴上,希望抛砖引玉,大家又什么更好的算法:

public  class  Sorter {
     public  static  void  main(String[] args){
         sort();
     }
 
     public  static  void  sort() {
         StringBuffer str =  new  StringBuffer();
         for ( int  i= 0 ;i< 4 ;i++) {
             int [] intArrays =  new  int []{ 1 2 3 4 };
             str.append(intArrays[i]);
             for ( int  j= 0 ;j< 3 ;j++) {
                 int [] secondArrays = getOthers(intArrays, intArrays[i]);
                 str.append(secondArrays[j]);
                 for ( int  k= 0 ;k< 2 ;k++) {
                     int [] thirdArrays =getOthers(secondArrays, secondArrays[j]);
                     str.append(thirdArrays[k]);
                     str.append(getOthers(thirdArrays, thirdArrays[k])[ 0 ]);
 
                     //找到最深处,打印这种情况
                     System.out.println(str.toString());
                     
                     //清除这种情况的操作,为新的情况准备
                     str.delete( 2 4 );
                 }
 
                 //清除这种情况的操作,为新的情况准备
                 str.delete( 1 2 );
             }
             
             //清除这种情况的操作,为新的情况准备
             str.delete( 0 1 );
         }
     }
     
     /*
     *返回除了me元素的其他元素的数组   
     */
     public  static  int [] getOthers( int [] old,  int  me) {
         int [] arrays =  new  int [old.length -  1 ];
         int  index =  0 ;
         for ( int  i= 0 ;i<old.length;i++) {
             if (old[i] != me) {
                 arrays[index++] = old[i];
             }
         }
         return  arrays;
     }
}

下面是用递归来写的:

package simpleTest;




import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;


public class Test2 {
public static void main(String[] args) {
String[] array = new String[]{"1","2","3"};
listAll(Arrays.asList(array), "");

}
public static void listAll(List candidate,String prefix){
if(candidate.isEmpty())
System.out.println("prefix="+prefix);
for(int i=0;i<candidate.size();i++){
List temp = new LinkedList(candidate);
//System.out.println("i="+i);
//System.out.println("temp="+temp);
listAll(temp,prefix+temp.remove(i));
//System.out.println("templast="+temp);

}
}


}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值