LeetCode题练习与总结:最大数--179

235 篇文章 0 订阅
141 篇文章 0 订阅

一、题目描述

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例 1:

输入nums = [10,2]
输出:"210"

示例 2:

输入nums = [3,30,34,5,9]
输出:"9534330"

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 10^9

二、解题思路

  1. 将所有数字转换为字符串,因为我们需要根据字符串拼接的结果来比较大小。
  2. 对字符串数组进行排序。排序的规则是:对于任意两个字符串a和b,如果拼接结果a+bb+a大,则a应该排在b前面。
  3. 将排序后的字符串数组拼接成一个字符串。
  4. 需要处理特殊情况,即如果最高位是0(例如输入是[0,0]),则应该返回"0"。

三、具体代码

import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public String largestNumber(int[] nums) {
        // 将整数数组转换为字符串数组
        String[] strNums = new String[nums.length];
        for (int i = 0; i < nums.length; i++) {
            strNums[i] = String.valueOf(nums[i]);
        }
        
        // 自定义比较器,根据拼接后的结果进行排序
        Arrays.sort(strNums, new Comparator<String>() {
            @Override
            public int compare(String a, String b) {
                String order1 = a + b;
                String order2 = b + a;
                return order2.compareTo(order1); // 降序排序
            }
        });
        
        // 如果排序后的第一个字符串是"0",则直接返回"0"
        if ("0".equals(strNums[0])) {
            return "0";
        }
        
        // 将排序后的字符串数组拼接成一个字符串
        StringBuilder sb = new StringBuilder();
        for (String s : strNums) {
            sb.append(s);
        }
        return sb.toString();
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 转换整数数组为字符串数组:需要遍历整个整数数组,这个操作的时间复杂度是O(n),其中n是数组nums的长度。
  • 对字符串数组进行排序:排序的时间复杂度取决于排序算法和比较操作的次数。在这个例子中,我们使用了Java的Arrays.sort方法,它通常使用的是经过优化的快速排序或归并排序,平均时间复杂度是O(n log n)。每次比较操作的时间复杂度是O(m),其中m是字符串的平均长度。因为每个字符串都要和其他所有字符串比较一次,所以总的时间复杂度是O(n^2 * m)。
  • 拼接字符串数组:需要遍历整个字符串数组,这个操作的时间复杂度是O(n)。

综合上述操作,时间复杂度是O(n^2 * m),其中n是数组nums的长度,m是字符串的平均长度。

2. 空间复杂度
  • 字符串数组strNums:需要存储所有转换后的字符串,空间复杂度是O(n)。
  • StringBuilder:在拼接字符串时,StringBuilder会根据需要动态扩展其容量,但最终占用的空间不会超过所有字符串长度之和,因此空间复杂度是O(n)。

综合上述操作,空间复杂度是O(n),其中n是数组nums的长度。

五、总结知识点

1. 数组和字符串转换

  • 使用String.valueOf()方法将整数转换为字符串。

2. 自定义比较器

  • 使用Java的Comparator接口来定义自定义比较逻辑。
  • 重写compare()方法来指定两个字符串如何比较。

3. 数组的排序

  • 使用Arrays.sort()方法对字符串数组进行排序。
  • 传递自定义比较器到Arrays.sort()方法中,以实现特定的排序规则。

4. 字符串比较

  • 使用String类的compareTo()方法来比较两个字符串的大小。

5. 字符串拼接

  • 使用StringBuilder类来高效地拼接多个字符串。

6. 条件判断

  • 使用if语句来检查特定条件(例如,检查排序后的第一个字符串是否为"0")。

7. 循环结构

  • 使用for循环来遍历数组或集合。

8. 字符串和整数的比较

  • 使用String类的equals()方法来比较字符串是否相等,而不是使用==

9. 异常处理

  • 在比较器中,隐式地处理了可能的NullPointerException(如果abnull,则a + b会抛出NullPointerException,但在这个特定的场景中不会发生,因为数组是通过String.valueOf()方法初始化的,不包含null值)。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直学习永不止步

谢谢您的鼓励,我会再接再厉的!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值