剑指 Offer 45. 把数组排成最小的数—一道字符串比较的问题

2023-10-30

在这里插入图片描述

写法一:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

剑指 Offer 45. 把数组排成最小的数—一道字符串比较的问题 的相关文章

随机推荐