题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{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
浙公网安备 33010602011771号