题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如,输入数组{3, 32,321},则打印出这3个数字能排成的最小数字321323。
核心在于自定义一个排序规则
解题思路
若ab > ba 则 a > b
若ab < ba 则 a < b若ab = ba 则 a = b解释说明:a = 21b = 2因为 212 < 221, 即 ab < ba ,所以 a < b所以我们通过对ab和ba比较大小,来判断a在前或者b在前的。
算法图解
比较简单不做图了!
参考代码:
package offer
;
import java
.util
.Arrays
;
import java
.util
.Comparator
;
public class Offer45 {
public static void main(String
[] args
) {
int num
[] = {3, 32, 321};
PrintMinNumber(num
);
}
public static String
PrintMinNumber(int[] numbers
) {
int len
= numbers
.length
;
if (len
== 0)
return "";
if (len
== 1)
return String
.valueOf(numbers
[0]);
StringBuffer res
= new StringBuffer();
String
[] str
= new String[len
];
for (int i
= 0; i
< len
; i
++) {
str
[i
] = String
.valueOf(numbers
[i
]);
}
Arrays
.sort(str
, new Comparator<String>() {
public int compare(String s1
, String s2
) {
String c1
= s1
+ s2
;
String c2
= s2
+ s1
;
return c1
.compareTo(c2
);
}
});
for (int i
= 0; i
< len
; i
++)
res
.append(str
[i
]);
return res
.toString();
}
}
附录
该题源码在我的 ?Github 上面!