java 全排列

示范一道题:


输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。


import java.util.*;

public class Solution {

 /*
 解题思路:
 1.将整数数组转化成字符串
 2.进行全排列   然后拼接字符串  
 3.将所有的拼接的结果存放在一个列表中
 4。将列表进行循环 然后找到最小的  返回结果
 5.当数组为空的时候  需要进行特殊情况的处理
 */
     private LinkedList<String> list=new LinkedList<String>();
         public String PrintMinNumber(int [] numbers) {
            String result="";//局部变量中需要进行初始化  要么就直接进行赋表达式  否则必须进行初始化
             if(numbers.length<=0)
                 return result;

             String s[]=new String[numbers.length];
             for(int i=0;i<numbers.length;i++){
                 s[i]=String.valueOf(numbers[i]);

             }

             permutation(s,0,s.length);
             long mix=Long.valueOf(list.get(0));
             for(String str:list){
                 long num=Long.valueOf(str);
                 if(mix>num)
                     mix=num;
             }
             result=String.valueOf(mix);

             return result;
            }

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

            // k表示当前选取的数在数组中的位置下标,m是要排列的数组的长度.  
            public  void permutation(String[] arr, int k, int m) { 
                // 当前位置与数组最后一个位置重合时,此时打印排列数.  


                if (k == m - 1) {
                    StringBuilder sb=new StringBuilder();
                   for(int i=0;i<arr.length;i++){
                       sb.append(arr[i]);

                   }
                   list.add(sb.toString());
                      System.out.println(sb.toString());
                } else { 
                    for (int i = k; i < m; i++) { 
                        // 当前位置元素与后面位置的元素依次替换  
                        swap(arr, k, i); 
                        permutation(arr, k + 1, m); 
                        // 将位置换回来,继续做下一个排列.  
                        // System.out.println("..k=" + k + " m=" + m + " i=" + i);  
                        swap(arr, k, i); 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值