返回轨道
算法 · 2026-05-14 · 23 阅读

P203 拼接的最大数字

算法 23 阅读

信号摘要

难度:Medium · 时长:11:46 · leetcode 179 · lintcode 184

P203 拼接的最大数字

未对外公开播放权限
点击查看说明

描述

这个题目说的是,给你一个数组,数组中的元素都是非负整数。你要重新排列这些整数,使得它们拼接后的数字最大,并返回这个数字。由于拼接后的数字可能非常大,因此结果以字符串的形式返回。

比如说,给你的非负整数数组是:

12, 8

数组中有两个元素,可以拼接成 "128" 或是 "812"。因此,拼接成的最大数字就是 "812"。注意,结果是一个字符串。

再比如说,给你的数组是:

3, 31, 36, 4, 8

这个数组可以拼接成的最大数字是 "8436331"。

代码

public class AlgoCasts {

  // Time: O(n*log(n)), Space: O(n)
  public String largestNumber(int[] nums) {
    if (nums == null || nums.length == 0) return "";
    String[] strs = new String[nums.length];
    for (int i = 0; i < nums.length; ++i) {
      strs[i] = String.valueOf(nums[i]);
    }
    Arrays.sort(strs, (o1, o2) -> {
      String o12 = o1 + o2;
      String o21 = o2 + o1;
      return o21.compareTo(o12);
    });
    if (strs[0].equals("0")) return "0";
    StringBuilder sb = new StringBuilder();
    for (String str: strs) sb.append(str);
    return sb.toString();
  }

  // Time: O(n*log(n)), Space: O(n)
  public String largestNumberFast(int[] nums) {
    if (nums == null || nums.length == 0) return "";
    String[] strs = new String[nums.length];
    for (int i = 0; i < nums.length; ++i) {
      strs[i] = String.valueOf(nums[i]);
    }
    Arrays.sort(strs, (o1, o2) -> {
      int n1 = o1.length(), n2 = o2.length();
      for (int i = 0; i < n1+n2; ++i) {
        char c1 = i < n1 ? o1.charAt(i) : o2.charAt(i-n1);
        char c2 = i < n2 ? o2.charAt(i) : o1.charAt(i-n2);
        if (c1 == c2) continue;
        return c2 - c1;
      }
      return 0;
    });
    if (strs[0].equals("0")) return "0";
    StringBuilder sb = new StringBuilder();
    for (String str: strs) sb.append(str);
    return sb.toString();
  }

}

📡 通讯频道