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

        根据题目的要求,两个数字m和n能拼接成数字mn和nm。如果mn<nm,应该打印mn,也就是m应该排在n的前面,定义m小于n;反之,nm<mn,定义n小于m;如果mn=nm,定义m等于n。为避免数字拼接导致结果有可能溢出,所以采取字符串拼接。

代码实现:

public class Solution{
      public static String printMinNumber(int[] numbers){
            if(numbers==null||numbers.length==0){
                  return "";
            }
            //冒泡法 排序
            for(int i=0;i<numbers.length;i++){
                 for(int j=0;j<numbers.length-i-1;j++){
                      if(compare(numbers[j],numbers[j+1])>0){
                             swap(numbers,j,j+1);
                      }
                 }
            }
            StringBuilder sb=new StringBuilder();
            for(int i:numbers){
                 sb.append(i);
           }
           return sb.toString();
      }
 
      //调换i和j的位置
      public static void swap(int[] arr,int i,int j){
            int temp=arr[i];
            arr[i]=arr[j];
            arr[j]=temp;
      }

      //比较m和n拼接之后,mn和nm的大小
      public static int compare(int m,int n){
           String s1=m+""+n;
           String s2=n+""+m;
           return s1.compareTo(s2);
      }
 
      public static void main(String[] args){
           int[] numbers={3,32,321};
           String s=printMinNumber(numbers);
           System.out.println(s);
      }
}

可以Collections.sort()来替代。

 Collections.sort(list, new Comparator<String>() {
       public int compare(String sNum1, String sNum2) {
             String num1 = sNum1 + sNum2;
             String num2 = sNum2 + sNum1;
             return num1.compareTo(num2);
       }
});

 

 posted on 2018-11-21 21:15  会飞的金鱼  阅读(85)  评论(0)    收藏  举报