对数组进行排序成最小的,相当于自己实现了一次String的compareTo函数,不过是另类的。

题目描述

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

//一气呵成

选择排序的思想,其实就是比较字符串的大小,将数字小的放在前面,但是比较的是位数,比如说3,23,得到的肯定是233,所以先比较首字符,但是如果一直相同就比较麻烦了,需要将长的那部分与短的首字符比较,这就是helper函数的意义。

 1 import java.util.ArrayList;
 2 
 3 public class Solution {
 4     public String PrintMinNumber(int [] numbers) {
 5         String res="";
 6         if(numbers.length==0)
 7             return res;
 8         String[] arr=new String[numbers.length];
 9         for(int i=0;i<numbers.length;i++)
10             arr[i]=""+numbers[i];
11         
12         for(int i=0;i<arr.length;i++)
13         {
14             int min=i;
15             for(int j=i;j<arr.length;j++)
16                 if(helper(arr[j],arr[min]))
17                     min=j;
18             swap(arr,i,min);
19         }
20         for(int i=0;i<arr.length;i++)
21             res+=arr[i];
22         return res;
23            
24     }
25     public void swap(String[] arr,int i,int j)
26     {
27         String temp=arr[i];
28         arr[i]=arr[j];
29         arr[j]=temp;
30     }
31     public boolean helper(String s1,String s2)
32     {
33         int len1=s1.length();
34         int len2=s2.length();
35         if(len1>len2)
36         {
37             for(int i=0;i<len1;i++)
38             {
39                 if(i<len2)
40                 {
41                     if(s1.charAt(i)>s2.charAt(i))
42                         return false;
43                     else if(s1.charAt(i)<s2.charAt(i))
44                         return true;
45                 }
46                 else
47                 {
48                     if(s1.charAt(i)<s2.charAt(0))
49                         return true;
50                     else if(s1.charAt(i)>s2.charAt(0))
51                         return false;
52                 }
53             }
54             return true;
55         }
56         else
57         {
58              for(int i=0;i<len2;i++)
59             {
60                 if(i<len1)
61                 {
62                     if(s1.charAt(i)>s2.charAt(i))
63                         return false;
64                     else if(s1.charAt(i)<s2.charAt(i))
65                         return true;
66                 }
67                 else
68                 {
69                     if(s1.charAt(0)<s2.charAt(i))
70                         return true;
71                     else if(s1.charAt(0)>s2.charAt(i))
72                         return false;
73                 }
74             }
75             return true;
76         }
77     }
78    
79 }