写法一:
class Solution {
public String minNumber(int[] nums) {
//如果为空
if(nums==null||nums.length==0) return null;
//创建字符数组
String[] strs=new String[nums.length];
//将每一个nums用valveOf的方法转换为字符数组的元素
for(int i=0;i<nums.length;i++){
strs[i]=String.valueOf(nums[i]);
}
//用Arrayss.sort(comparetor)进行排序
/*Arrays.sort(strs,new Comparator<String>(){
public int compare(String s1,String s2){
//比较两个字符串和大小(谁小,谁放在前面)
return (s1+s2).compareTo(s2+s1);
}
});
*/
//简化
Arrays.sort(strs,(s1,s2)-> (s1+s2).compareTo(s2+s1));
//用StringBuilder来承接每个排好序的字符串
StringBuilder sb=new StringBuilder();
for(String str:strs){
sb.append(str);
}
//返回
return sb.toString();
}
}
写法二:
class Solution {
public String minNumber(int[] nums) {
List<String> list = new ArrayList<>();
for (int num : nums) {
list.add(String.valueOf(num));
}
list.sort((o1, o2) -> (o1 + o2).compareTo(o2+ o1));
return String.join("", list);
}
}
核心剖析
这道题,就是靠你字符数组元素的大小比较,其实就是考的一个compareTo。
重点在这里:
//用Arrayss.sort(comparetor)进行排序
/*Arrays.sort(strs,new Comparator<String>(){
public int compare(String s1,String s2){
//比较两个字符串和大小(谁小,谁放在前面)
return (s1+s2).compareTo(s2+s1);
}
});
*/
//简化
Arrays.sort(strs,(s1,s2)-> (s1+s2).compareTo(s2+s1));
这里的方法什么意思呢?
我们知道以下几个知识点。
CompareTo的比较原理:
先读取出字符串的第一个“字母”进行比较,比较的方法是ascii码表的值(字符所对应的十进制值),如果前面的大那么返回1,后面的大返回-1;此位置相同,继续比较下一位,直到最后一位,如果都相同的话,就返回0;
系统List默认的排序是升序,如果你想要降序,可以直接在比较函数前面加个负号,把返回结果由1变成-1即可
其实就是sort和compareTo打了个配合,sort要求compareTo方法快速筛选,相邻字符串的大小排序,sort默认是小的放在前面,但是,那个小它不清楚,所以就需要compareTo的返回值来告诉他。本题就是以相邻的两个字符串不同位置的和为判断基础,所以我们只需要按不同顺序比较加和,然后再告诉sort哪个小就可以了。
讲解视频分享:【小美算法 剑指Offer 45题 把数组排成最小的数 如何对字符串数组进行排序 比较器的应用-哔哩哔哩】 https://b23.tv/7gqZ0hD