Computer >> 컴퓨터 >  >> 프로그램 작성 >> JavaScript

JavaScript의 두 배열에서 최대 수 찾기

<시간/>

문제

첫 번째와 두 번째 인수로 arr1과 arr2라는 두 개의 숫자를 나타내는 한 자리 숫자의 두 배열을 취하는 JavaScript 함수를 작성해야 합니다. 함수에 대한 세 번째 인수는 숫자입니다.

num (num <= length of arr1 + length of arr2)

우리의 함수는 길이가 num이고 그 자체로 숫자를 나타내는 한 자리 숫자의 새 배열을 반환해야 합니다. 그리고 그 숫자는 두 배열의 요소를 사용하여 만들 수 있는 최대 숫자여야 합니다. 유일한 조건은 동일한 배열에서 요소의 상대적 순서를 유지해야 한다는 것입니다.

예를 들어, 함수에 대한 입력이 -

인 경우
const arr1 = [1, 3, 4, 5, 6];
const arr2 = [9, 1, 2, 5, 8, 3];
const num = 4;

그러면 출력은 다음과 같아야 합니다. -

const output = [9, 8, 6, 3];

예시

이에 대한 코드는 -

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));

코드 설명:

우리가 취한 단계는 -

  • 남은 개수가 허용될 때까지 for 루프를 사용합니다.

  • arr1이 arr2보다 큰 숫자를 가지고 있으면 arr1 숫자를 먼저 사용하고, 그렇지 않으면 arr2number를 사용합니다.

  • for-loop가 허용될 때까지 arr1과 arr2가 같은 숫자를 가질 때 두 값을 비교하기 위해 재귀만 사용하고 더 큰 숫자를 선택했습니다.

출력

콘솔의 출력은 -

[ 9, 8, 6, 3 ]