题目描述:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路:
本题考察字符串的比较。
string中的compareTo逻辑大概可以整理为:
1)字符串前面部分的每个字符完全一样,返回:后面两个字符串长度差;
如s1=ABC s2=ABCD返回 s1.compareTo(s2)为-1
2)字符串前面部分的每个字符存在不一样,返回:出现不一样的字符 ASCII 码的差值。
s1=BBC s2=ABCD 返回1,B比A大1
3)字符串的每个字符完全一样,返回 0;
本题要求串联后要小,就是s1+s2,和s2+s1中选择较小的那个,如果s2+s1更大,那么s1应该在前面。即按升序(按字ASCII 顺序)
小的排在前面。不能直接s1.compareTo(s2)!!!
package swordToOffer._32_PrintMinNumberFromAStringArr;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Solution {
public String PrintMinNumber(int[] numbers) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < numbers.length; i++) {
list.add(numbers[i]);
}
Collections.sort(list, new Comparator<Integer>() {
@Override
/*
返回负数代表o1<o2,o1位置在前;正数o1>o2,o1位置在后;0相等,位置不变;默认升序
*/
public int compare(Integer o1, Integer o2) {
String s1 = o1 + "" + o2;
String s2 = o2 + "" + o1;
//按字典顺序,如果s1>s2(说明o1的字典顺序在后,更大),
// 返回正数,则o1>o2,o2排在o1前面(默认升序)
return s1.compareTo(s2);
}
});
String s = "";
for (int num : list) {
s += num;
}
return s;
}
}