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

在这里插入图片描述

写法一:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值