LeetCode - 179. Largest Number

本文介绍了一种通过自定义排序规则实现字符串拼接形成最大数值的方法,并详细展示了如何利用Java的Comparator接口来完成这一任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题目的解答非常聪明而巧妙,我们先来看下面的一个例子:

str1 = "338"

str2 = "9"

s1 = str1 + str2 = "3389"

s2 = str2 + str1 = "9338"

明显9338 > 3389,所以这时我们选择str2在前是明智的。

根据上面的分析,我们可以设计出一个比较大小的规则,使得如果上面的情况发生的话,有str1 < str2,而Java中的Comparator<>接口提供了这种功能,因为Comparator是一个接口,不能对它进行实例化,所以我们可以在题目中给出的Solution类中新建一个内部类stringComp或者使用匿名类来实现这个我们需要的类。

要新建一个类实现Comparator接口的话,需要在类中添加并实现一个方法int compare(T t1, T t2)。在这一步做出之后,剩下的就简单了,只需要调用Arrays.sort()函数并且使用StringBuilder把所有的String连接在一起即可,代码如下:

public class Solution {
    class stringComp implements Comparator<String>{
        @Override
        public int compare(String str1, String str2){
            String s1 = str1 + str2;
            String s2 = str2 + str1;
            return s2.compareTo(s1);
        }
    }
    
    public String largestNumber(int[] nums) {
        if(nums == null || nums.length == 0) return "";
        
        // Convert int to String
        String[] numsString = new String[nums.length];
        for(int i = 0; i < nums.length; i++){
            numsString[i] = String.valueOf(nums[i]);
        }
        
        // Sort String based on self-defined rull
        Arrays.sort(numsString, new stringComp());
        
        // An extreme corner case by lc, say you have only a bunch of 0 in your int array
        if(numsString[0].charAt(0) == '0') return "0";
        
        // Construct answer
        StringBuilder sb = new StringBuilder();
        for(String s : numsString){
            sb.append(s);
        }
        return sb.toString();
    }
}

注意在实现compare函数的时候,我们并不是使用s1.compareTo(s2),而是使用s2.compareTo(s1),因为Arrays.sort是默认从小到大排序的,我们需要的是从大到小,所以使用了这里的一个小技巧。

知识点:

1. 这道题目里的知识点很多了,大部分是关于Java的,最重要的就是自定义比较函数的方法,Arrays.sort(Object[], Comparator<>),Comparator的使用

2. 注意将int转化为String的方法,String.valueOf(int i)就把int变成了相对应的String

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值