任意数字序列“123456”之类,输出它们所有的排列组合

 

作为一个菜鸟,难得动手,记录下尴尬。思路是:排列组合,高中数学解法是6个中选一个,然后5个中选一个,4选1,3选1。。这样组合就完成了。假设需要排列组合的字符串为“123”,先取“1”,然后“2”,“3”,得出“123”,这里明显看出取“1”后,取“3”,再取“2”得“132”。这时候我想一开始获得“123”后,能不能直接返回到取“2”那个阶段,把“2”改为“3”,貌似这样比较省力哦!尴尬这个与递归有点像,于是就很粗暴地用递归的方法写下来了。。表示什么空间效率,时间效率什么的完全没有思考,求高手指点。。

 

 static int count =0;
 public static void main(String[] args){
  
  String str ="123";//待排序字符串
  ArrayList<Character> l=new ArrayList<Character>();//把待排序的字符串分成单个字符并保存进List里面
  for(int i=0;i<str.length();i++){
   l.add(str.charAt(i));
  }

  StringBuffer sb=new StringBuffer();//用于记录组合的字符串
        deep(sb,l); //递归,组合字符串

  System.out.println("共有:"+count);
  
 }
 
 public static void deep(StringBuffer sb,ArrayList<Character> list){
  
  //判断是否组合完成,当已经组合好后l.size()=0,不理解可以跳过先
  if(list.size()>0){
   //备份字符串,用于一轮组合完成后,恢复list的原貌,进行下一轮的组合.不理解可以跳过先
   ArrayList<Character> list2=new ArrayList<Character>(list);
   String ostr=sb.toString();
   
   for(int i=0;i<list.size();i++){//
    
    sb=new StringBuffer(ostr);//sb作为参数传递,当一轮组合完成后,需要恢复原状,你可以注释掉看看效果
    
    sb.append(list.get(i));//组合当前这个字符
    list.remove(list.get(i));//移除刚刚组合的这个字符,这样list剩下的字符都是需要排列组合,不会重复,去到最后list。size()=0
    
    deep(sb,list);//递归,进入下一个字符的组合
    
    list=new ArrayList(list2);//来到这里表示已经完成以某一个字符在特定的位置的排序已经完成,接着是下一个字符在这个特定的位置的组合了,需要把list还原成原状
   }
  }
  else{
   System.out.println(sb.toString());//sb中的是已经组合好的其中一种字符串
   count+=1;//计算总共有多少种组合
  }
 }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值