leetcode题解179-最大数
发布日期:2025-04-05 05:20:07 浏览次数:10 分类:精选文章

本文共 1923 字,大约阅读时间需要 6 分钟。

将给定的非负整数重新排列,每个数字不可拆分,使得整体组成一个最大的整数。为了实现这一目标,可以按照自定义的字符串比较规则对数字进行排序,然后将排序后的数字拼接成结果字符串。以下是详细步骤说明:

解题思路

  • 问题分析:

    • 给定一个整数数组 nums,目标是重新排列这些数字,使得它们拼接后的字符串值最大。
    • 最大的整数可以通过字符串排序来实现,每个数字作为独立的字符串进行比较。
  • 字符串比较规则:

    • 对于两个数字 xy,将它们转换为字符串 sxsy
    • 比较 sx + sysy + sx 的大小。
    • 如果 sx + sy 大于 sy + sx,则 x 应该放在 y 前面;否则,y 应该放在 x 前面。
  • 边界情况处理:

    • 如果所有数字都为零,直接返回字符串 "0"。
    • 否则,使用自定义排序规则对数字排序。
  • 具体实现:

    • 将数组中的每个数字转换为字符串。
    • 使用自定义比较器对字符串数组进行排序。
    • 拼接排序后的字符串结果。
  • 解决代码

    import java.util.Arrays;import java.util.Comparator;public class Solution {    public String largestNumber(int[] nums) {        if (nums.length == 0) {            return "0";        }        Integer[] onums = new Integer[nums.length];        for (int i = 0; i < nums.length; i++) {            onums[i] = nums[i];        }        Arrays.sort(onums, new Comparator
    () { @Override public int compare(Integer x, Integer y) { String sx = String.valueOf(x); String sy = String.valueOf(y); String xy = sx + sy; String yx = sy + sx; for (int i = 0; i < Math.min(xy.length(), yx.length()); i++) { int a = xy.charAt(i) - '0'; int b = yx.charAt(i) - '0'; if (a > b) { return -1; } else if (a < b) { return 1; } } return 0; } }); StringBuilder sb = new StringBuilder(); for (Integer num : onums) { sb.append(String.valueOf(num)); } return sb.toString(); }}

    代码解释

    • 定义类 Solution:包含使用 @Override 注解定义的 largestNumber 方法。
    • 处理空数组情况:如果 nums 为空,直接返回 "0"。
    • 转换数组元素:将 nums 数组中的每个整数转换为 Integer 对象,存储在 onums 数组中。
    • 自定义排序:使用 Arrays.sort 方法对 onums 数组进行排序,自定义比较逻辑:
      • 将每个数字转换为字符串。
      • 比较两个字符串拼接的结果,决定排序顺序。
    • 拼接结果字符串:使用 StringBuilder 逐个拼接排序后的数字字符串,构造最终结果字符串。

    该解决方案通过自定义的字符串拼接比较规则,确保了在最坏情况下也能高效地找到最大的排列,适用于非常大的整数范围。

    上一篇:leetcode题解189-旋转数组
    下一篇:leetcode题解173-二叉搜索树迭代器

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年05月04日 19时55分10秒