剑指Offer:把数组排成最小的数【45】
剑指Offer:把数组排成最小的数【45】
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如,输入数组是{3.32.321},则打印出来的这3个数字能拼接成的最小数字是321323.
方法论
简要思路
最暴力的方法是把这个数组中的所有数字的全排列暴力出来,然后找个最小的。但是显然我们不能这么做。
我们应该定义一个排序规则,:
先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则。
* 排序规则如下:
* 若ab > ba 则 a > b,
* 若ab < ba 则 a < b,
* 若ab = ba 则 a = b;
* 解释说明:
* 比如
"3"
<
"31"
但是
"331"
>
"313"
,所以要将二者拼接起来进行比较.
总结就是说,要把数组元素组成一个最小值,我们可以让数组元素按照最小值排列的规则进行排序,而最小值排列的排序规则就是让两两组合值较小的那种情况下的元素放在前面,我们可以用冒泡排序排列来想象这个过程。
Java代码
import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; public class NumArrToMinNum { public static void main(String[] args) { Scanner input = new Scanner(System.in); String line =input.nextLine(); String[]arr =line.split(" "); Arrays.sort(arr, new Comparator<String>() { @Override public int compare(String o1, String o2) { return (o1+o2).compareTo(o2+o1); } }); String re=""; for(String str:arr) re+=str; System.out.println(re); } public String PrintMinNumber(int [] numbers) { String[]arr =new String[numbers.length]; for(int i=0;i<arr.length;i++) arr[i]=String.valueOf(numbers[i]); Arrays.sort(arr, new Comparator<String>() { @Override public int compare(String o1, String o2) { return (o1+o2).compareTo(o2+o1); } }); String re=""; for(String str:arr) re+=str; return (re); } }