欢迎访问宙启技术站
智能推送

js求数组中全部数字可拼接出的最大整数示例代码

发布时间:2023-05-17 19:08:57

题目描述:

给定一个由非负整数构成的数组,将它们按照字典序排序后拼接成一个整数,求这个整数的最大值。

例如,数组 [3, 30, 34, 5, 9] 可以拼接成数字 9534330,为最大值。

解题思路:

直接将数组按照字典序排序会出现问题,例如对于数组 [3, 30],按照字典序排序得到 [30, 3],但是显然正确的排列顺序应该是 [3, 30],因为拼接后的数字 330 要比 303 大。

所以我们要自定义一种排序规则,排序时比较两个数 ab

- 如果 ab 拼接起来得到的数字大于 ba 拼接起来得到的数字,那么 a 应该排在 b 的前面;

- 如果 ab 拼接起来得到的数字小于 ba 拼接起来得到的数字,那么 a 应该排在 b 的后面;

- 如果 ab 拼接起来得到的数字相等,那么 ab 相对顺序不变。

这个排序规则是根据题目要求得出的,比较函数的具体实现如下:

function compare(a, b) {

let ab = "" + a + b;

let ba = "" + b + a;

return ba.localeCompare(ab);

}

将数组按照上述规则排序,然后将数组中的所有数拼接起来得到结果。

解题代码:

function largestNumber(nums) {
  nums.sort(compare);
  let result = nums.join('');
  if (result[0] === '0') {
    return '0';
  }
  return result;
}

function compare(a, b) {
  let ab = "" + a + b;
  let ba = "" + b + a;
  return ba.localeCompare(ab);
}

console.log(largestNumber([3, 30, 34, 5, 9])); // "9534330"
console.log(largestNumber([0, 0])); // "0"
console.log(largestNumber([0, 1, 0])); // "110"

完整代码:

/**
 * 求数组中全部数字可拼接出的最大整数
 * @param {number[]} nums
 * @return {string}
 */
function largestNumber(nums) {
  nums.sort(compare);
  let result = nums.join('');
  if (result[0] === '0') {
    return '0';
  }
  return result;
}

/**
 * 比较函数,根据题目要求自定义排序规则
 * @param {number} a
 * @param {number} b
 * @return {number}
 */
function compare(a, b) {
  let ab = "" + a + b;
  let ba = "" + b + a;
  return ba.localeCompare(ab);
}

console.log(largestNumber([3, 30, 34, 5, 9])); // "9534330"
console.log(largestNumber([0, 0])); // "0"
console.log(largestNumber([0, 1, 0])); // "110"

时间复杂度:排序的时间复杂度为 $O(n \log n)$,拼接数组的时间复杂度为 $O(n)$,所以总的时间复杂度为 $O(n \log n)$。

空间复杂度:没有使用额外的空间,所以空间复杂度为 $O(1)$。