두 개의 Number 배열이 있고 함수를 작성해야 합니다. 예를 들어 이들의 교차를 계산하고 교차하는 요소를 임의의 순서로 포함하는 배열을 반환하는 Intersection() 함수를 작성해야 합니다. 결과의 각 요소는 두 배열에 표시되는 횟수만큼 표시되어야 합니다.
예를 들어 -
입력이 -
인 경우arr1 = ['hello', 'world', 'how', 'are', 'you']; arr2 = ['hey', 'world', 'can', 'you', 'rotate'];
그러면 출력은 다음과 같아야 합니다. -
Output: ['world', 'you'];
접근
배열이 정렬된 경우 처음에는 둘 다 각각의 배열의 시작을 0으로 가리키는 두 포인터 접근 방식을 사용할 수 있었고 해당 포인터를 증가시키면서 O(m+n) 복소수 w.r.t가 될 수 있었습니다. 여기서 m과 n은 배열의 크기입니다.
그러나 정렬되지 않은 배열이 있으므로 배열을 정렬한 다음 이 접근 방식을 사용하는 데 논리가 없으므로 첫 번째 값과 두 번째 값을 모두 확인하고 교차 배열을 구성합니다. O(n^2) 시간이 소요됩니다.
예시
다음은 코드입니다 -
arr1 = ['hello', 'world', 'how', 'are', 'you']; arr2 = ['hey', 'world', 'can', 'you', 'rotate']; const intersectElements = (arr1, arr2) => { const res = []; const { length: len1 } = arr1; const { length: len2 } = arr2; const smaller = (len1 < len2 ? arr1 : arr2).slice(); const bigger = (len1 >= len2 ? arr1 : arr2).slice(); for(let i = 0; i < smaller.length; i++) { if(bigger.indexOf(smaller[i]) !== -1) { res.push(smaller[i]); bigger.splice(bigger.indexOf(smaller[i]), 1, undefined); } }; return res; }; console.log(intersectElements(arr1, arr2));
출력
이것은 콘솔에 다음과 같은 출력을 생성합니다 -
[ 'world', 'you' ]