题目如图
思路
- 假设一个数组 m,我们为了求解其按照内部元素顺序所能组成的所有的 n 位数的最大数,实现一个函数 getMax
- 针对数组 m、n分别求取其最大值,想要使得最大值的位数之和为 k,则需要实现一个mergeArray 的方法,用来 merge 两个最大值数组
代码
const m = [3, 4, 6, 5], n = [9, 1, 2, 5, 8, 3], k = 5
const getLargerNum = (m, n, k) => {
const ml = m.length
const nl = n.length
if (k === 0 || ml === nl === 0) return []
if (k === (ml + nl)) return m >= n ? m.concat(n) : n.concat(m)
function getMax(arr, n) {
if (!n) return []
if (n >= arr.length) return arr
let array = [], max_index = 0
while (n > 0) {
let temp = arr[max_index]
for (let x = max_index + 1; x <= arr.length - n; x++) {
if (temp < arr[x]) {
temp = arr[x]
max_index = x
}
}
array.push(temp)
n--
max_index++
}
return array
}
function mergeArray(a, b) {
let i = j = 0, array = [], al = a.length, bl = b.length
while (i < al || j < bl) {
if ((b[j] > a[i] && b[j]) || !a[i]) {
array.push(b[j])
j++
} else if ((b[j] <= a[i] && a[i]) || !b[j]) {
array.push(a[i])
i++
}
}
return array
}
let index = 0
let array = []
while (index <= k) {
if (index <= ml && k - index <= nl) {
let temp1 = getMax(m, index)
let temp2 = getMax(n, k - index)
let temp = mergeArray(temp1, temp2)
array = array > temp ? array : temp
}
index++
}
return array
}
console.log(getLargerNum(m, n, k))