剑指offer第三十二题。

题目描述

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

解题思路

比如题中给的例子:{3,32,321}

我们来看看,假如只有{3,32}那么3 < 32,但是332 > 323,所以需要将3和32调个位置才行。

也就是说,两两拼接比较一下,如果前者大于后者则交换,所以需要将数组按照这种规则进行重新的排序。

我的答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.*;
public class Solution {
public String PrintMinNumber(int [] numbers) {
List<Integer> list = new ArrayList<>();
for(int temp:numbers){
list.add(temp);
}
String s = "";
//这里拼接其中两个进行比较
//比如输入{3,32,321},采用compare比较之后,变成了{321,32,3}
//比较的根据是,比如3和32,332>323的,那么返回1,则交换这两个位置的数字
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
String s1 = o1+""+o2;
String s2 = o2+""+o1;
return s1.compareTo(s2);
}
});
//拼接结果返回
StringBuilder sb = new StringBuilder();
for(int i:list){
sb.append(i);
}
return sb.toString();
}
}