【剑指offer-32】把数组排成最小的数
- 考点:数组
- 时间限制:1秒
- 空间限制:32768K
- 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路:
先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则。
- 排序规则如下:
- 若ab > ba 则 a > b,
- 若ab < ba 则 a < b,
- 若ab = ba 则 a = b;
- 解释说明:
- 比如 “3” < "31"但是 “331” > “313”,所以要将二者拼接起来进行比较
所以说在这个地方,应该是31拍在3的前面。最后按照顺序,把这个整个字符串给串接起来就得到答案了。
代码:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
public class Solution {
public String PrintMinNumber(int [] numbers) {
// 判断
if (numbers == null) {
return "";
}
int len = numbers.length;
String[] str = new String [len];
StringBuffer sb = new StringBuffer();
// 把所有数字转成字符串
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++) {
sb.append(str[i]);
}
return sb.toString();
}
}
我的问题:
- 对比较函数还是不够熟悉。
在这里自己写一个数组里面进行比较的函数要注意:- 引入包,比如说这里用到了的是Arrays的sort方法,因此要引入import java.util.Arrays;
- 这个方法,第一个参数是要排序的数组,第二个参数是比较器,也就是comparator,类型是String。
- 在这个类里面,要重写他的一个compare函数,参数是两个比较的对象,在这里我们要进行比较的是拼接之后字符串的大小,所以比较c1和c2的大小,反悔的时候是返回c1.compareTo(c2),使用了这个方法进行字符串的比较。
- 排序完了之后,直接按照从小到大的顺序把整个数组拼接在一起成为一个新的字符串,这个时候我们就得到了我们想要的答案了。
其他思路1
在比较的方法里面,还看到有人直接用排序的方法,也就是没有用java提供的一些比较器的方法,这样也是可以的,并且思路是一样的的。
public class Solution {
public String PrintMinNumber(int [] numbers) {
String str = "";
for (int i=0; i<numbers.length; i++){
for (int j=i+1; j<numbers.length; j++){
int a = Integer.valueOf(numbers[i]+""+numbers[j]);
int b = Integer.valueOf(numbers[j]+""+numbers[i]);
if (a > b){
int t = numbers[i];
numbers[i] = numbers[j];
numbers[j] = t;
}
}
}
for (int i = 0; i < numbers.length; i++) {
str += String.valueOf(numbers[i]);
}
return str;
}
}