3 分钟阅读

困难算法题,拼接最大数,使用 JavaScript 语言编写

题目

给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。

现在从这两个数组中选出 k (0 <= k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。 求满足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。

输入格式

输入三个行内容:

  • 第一行是数组nums1,元素内容用逗号分隔;数组最大长度为1000。
  • 第二行是数组nums2,元素内容用逗号分隔;数组最大长度为1000。
  • 第三行是长度k;

输出格式

返回一个表示该最大数的长度为 k 的数组,数组元素用逗号隔开。

输入样例

3,4,6,5
9,1,2,5,8,3
5

输出样例

9,8,6,5,3

提示

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 9

分析

解答


// 这是题目要求的输入格式
let inputs = `
3,4,6,5
9,1,2,5,8,3
5
`;
const nums = inputs.trim().split('\n').map(line => line.split(',').map(Number));

function maxSubsequence(nums, len) {
  const stack = [];
  let drop = nums.length - len;
  for (const num of nums) {
    while (drop > 0 && stack.length > 0 && stack[stack.length - 1] < num) {
      stack.pop();
      drop--;
    }
    stack.push(num);
  }
  return stack.slice(0, len);
}
function merge(subseq1, subseq2) {
  const merged = [];
  while (subseq1.length > 0 || subseq2.length > 0) {
    if (subseq1 > subseq2) {
      merged.push(subseq1.shift());
    } else {
      merged.push(subseq2.shift());
    }
  }
  return merged;
}

function maxNumber(nums1, nums2, k) {
  let maxResult = [];
  for (let i = Math.max(0, k - nums2.length); i <= Math.min(k, nums1.length); i++) {
    const subseq1 = maxSubsequence(nums1, i);
    const subseq2 = maxSubsequence(nums2, k - i);
    const candidate = merge(subseq1, subseq2);
    if (candidate > maxResult) {
      maxResult = candidate;
    }
  }
  return maxResult;
}

console.log(maxNumber(nums[0], nums[1], nums[2][0]).join(',')); // 9,8,6,5,3

留下评论