最大数

203 阅读1分钟

179. 最大数 - 力扣(LeetCode)

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

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

示例 1:

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

示例  2:

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

提示:

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

思路

本题求重新排列后组成的最大整数,那么我们就要在相同的位置上尽量放置可能大的数。具体到两个数 ab 比较,

  • 如果他们首位不相等,首位大的排列在前,比如 5305 排在 30 前面,即 530
  • 如果首位相等,再比较第二位,一直比较下去,直到有不相等的。比如 5231524524 排在 5231 前面,即 5245231
  • 如果直到一个数比较完最后一位还相等,52352352,当 523 比较完了还无法确定那个在前,这时我们可以把 52352 拼接到 523 后面继续比较,当 52352 比较完了还无法确定,我们把 523 拼接到 52352 后面继续比较,如果比较完仍然相等,那么这两个排序顺序无所谓先后。

看着上面挺复杂的,其实说白了就是比较 abba 的大小,当 ab > ba 时,a 应该排在 b 前,当 ab < ba 时,a 应该排在 b 后,当 ab = ba 时,ab 的排序无所谓先后

解题

/**
 * @param {number[]} nums
 * @return {string}
 */
var largestNumber = function (nums) {
  const ns = nums.map((n) => n.toString());
  const compare = (a, b) => {
    const temp = a;
    a = a + b;
    b = b + temp;
    return +b - a;
  };

  ns.sort((a, b) => compare(a, b));
  return ns.join("").replace(/^0+/, 0);
};