剑指offer-把数组排成最小的数
题目:把数组排成最小的数
题目描述:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路分析:总的来讲,这是一道排序的题,从最开始的两个结合后开始比较,然后调整顺序,一直排到末尾,最终便能得到最小的数字
1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.Comparator; 4 public class Solution { 5 public String PrintMinNumber(int [] numbers) { 6 int n; 7 String s=""; 8 ArrayList<Integer>list=new ArrayList<Integer>(); 9 n=numbers.length; 10 for(int i=0;i<n;i++){ 11 list.add(numbers[i]); 12 } 13 Collections.sort(list,new Comparator<Integer>(){ 14 public int compare(Integer str1,Integer str2){ 15 String s1=str1+""+str2; 16 String s2=str2+""+str1; 17 return s1.compareTo(s2); 18 } 19 }); 20 for(int j:list){ 21 s+=j; 22 } 23 return s; 24 } 25 }
以上这个解法主要还是利用了比较器,通过比较器逐一调整顺序,当然也可以直接利用数组进行比较大小,有关比较器的知识可以看我的上一篇博客,有我自己的总结
1 public class Solution { 2 public String PrintMinNumber(int [] numbers) { 3 String str = ""; 4 for (int i=0; i<numbers.length; i++){ 5 for (int j=i+1; j<numbers.length; j++){ 6 int a = Integer.valueOf(numbers[i]+""+numbers[j]); 7 int b = Integer.valueOf(numbers[j]+""+numbers[i]); 8 if (a > b){ 9 int t = numbers[i]; 10 numbers[i] = numbers[j]; 11 numbers[j] = t; 12 } 13 14 } 15 } 16 for (int i = 0; i < numbers.length; i++) { 17 str += String.valueOf(numbers[i]); 18 } 19 return str; 20 } 21 }