Vấn đề
Chúng tôi được yêu cầu viết một hàm JavaScript nhận trong hai mảng các số có một chữ số đại diện cho hai số, arr1 và arr2 làm đối số đầu tiên và thứ hai. Đối số thứ ba của hàm sẽ là một số,
num (num <= length of arr1 + length of arr2)
Hàm của chúng ta sẽ trả về một mảng mới gồm các số có một chữ số có độ dài là num, bản thân nó đại diện cho một số. Và con số phải là số lượng tối đa chúng ta có thể tạo bằng cách sử dụng phần tử từ cả hai mảng, điều kiện duy nhất đối với chúng ta là chúng ta phải bảo toàn thứ tự tương đối của các phần tử trong cùng một mảng.
Ví dụ:nếu đầu vào của hàm là -
const arr1 = [1, 3, 4, 5, 6]; const arr2 = [9, 1, 2, 5, 8, 3]; const num = 4;
Sau đó, đầu ra phải là -
const output = [9, 8, 6, 3];
Ví dụ
Mã cho điều này sẽ là -
const arr1 = [1, 3, 4, 5, 6]; const arr2 = [9, 1, 2, 5, 8, 3]; const num = 4; const maxArray = (arr1 = [], arr2 = [], num) => { const map = new Map(); const match = (a, b, num) => { if (map.has(a + ',' + b + ',' + num)) { return map.get(a + ',' + b + ',' + num); } let output = []; while(num > 0) { let maxa = -Infinity; let maxai = 0; let maxb = -Infinity; let maxbi = 0; for(let i = a; i < arr1.length && arr1.length + arr2.length - (i + b) >= num; i++) { if (arr1[i] > maxa) { maxa = arr1[i]; maxai = i; } } for(let i = b; i < arr2.length && arr1.length + arr2.length - (a + i) >= num; i++) { if (arr2[i] > maxb) { maxb = arr2[i]; maxbi = i; } } if (maxa === maxb) { output.push(maxa); let ca = map.get(a+','+(maxbi+1)+','+(num-1)) || match(a, maxbi+1, num-1); let cb = map.get((maxai+1)+','+b+','+(num-1)) || match(maxai+1,b,num-1); map.set(a+','+(maxbi+1)+','+(num-1), ca); map.set((maxai+1)+','+b+','+(num-1), cb); if (ca.join('') > cb.join('')) { return [...output, ...ca]; } else { return [...output, ...cb]; } } else if (maxa > maxb) { output.push(maxa); a = maxai + 1; } else { output.push(maxb); b = maxbi + 1; } num--; } map.set(a + ',' + b + ',' + num, output); return output; } return match(0, 0, num); }; console.log(maxArray(arr1, arr2, num));
Giải thích mã:
Các bước chúng tôi đã thực hiện là -
-
Được sử dụng trong vòng lặp cho đến khi số còn lại được cho phép.
-
Nếu arr1 có số cao hơn arr2, chúng tôi đã sử dụng số arr1 trước, nếu không, chúng tôi sử dụng arr2number.
-
khi arr1 và arr2 có cùng một số cho đến khi cho phép vòng lặp for, chúng tôi chỉ sử dụng đệ quy để so sánh hai giá trị và chọn số lớn hơn.
Đầu ra
Và đầu ra trong bảng điều khiển sẽ là -
[ 9, 8, 6, 3 ]