2017-12-30 39 views
0

이 질문을 해결하는 두 가지 다른 기능이 있습니다.다른 결과를 가진 배열에서 한 쌍의 요소를 찾는 방법

하지만 모두 매우 다른 결과를 생산하는 "합 소정 수와 동일한 배열의 요소의 쌍을 찾기". 왜 그들은 같은 결과를 내고 있지 않습니까? 하나는 5 쌍, 다른 하나는 6 쌍입니다.

하나는 이중 루프를 사용합니다.

export function pairElements(arr, arg) { 
    var pairArr = arr.slice(); // return a copy of arr 
    var result=[]; 
    for(var i = 0; i < pairArr.length; i++) { 
    for(var j = i + 1; j < pairArr.length; j++) { 
     if(pairArr[i] + pairArr[j] == arg) { 
     let pair = [pairArr[i], pairArr[j]]; 
     result.push(pair); 
    } 

    } 
} 
return result; 
} 

pairElements([1,4,2,3,0,5,4,3], 7); 
result = [ [4, 3], [4, 3], [2, 5], [3, 4], [4, 3] ]; 

두 번째는이 방법을 줄일 사용

function pairReduce(arr, arg) { 
    var pairArr = arr.slice(); 
    var result=[]; 
    return pairArr.reduce(function (a,b,index){ 
     let pair = []; 
     let search = arg - b; // get difference of current item so we know what value will sum to arg 
     let searchIndex = pairArr.indexOf(search); 

     if (searchIndex != -1 && searchIndex != index){ 
     pair.push(b, search); 
     result.push(pair); 
     } 
     return result; 
    }, 0); 
} 

pairReduce([1,4,2,3,0,5,4,3], 7)); 
result = [ [4, 3], [2, 5], [3, 4], [5, 2], [4, 3], [3, 4] ] 
+0

로직이 완전히 다릅니다. 어떤 운동의 목적이 명확하지 않은가도 – charlietfl

+0

나는 그것을 모은다! 하지만 여전히 내 질문에 대답하지 않습니다. 왜 한 쌍은 5 쌍을 생산하고 다른 한 쌍은 6 쌍을 생산합니까? –

+0

디버거를 사용하여 파악하십시오. 하나는 다중 루프를 가지고, 다른 하나는 완전히 다른 것을합니다. 우리는 사과와 오렌지를 비교해달라고 요청합니다 – charlietfl

답변

0

첫 번째 방법은 자연 아직 정확한 매우 직선적이다 : 배열의 각 요소에 대한 당신의 나머지 부분을 통해 이동 쌍을 찾고있는 요소 (추가 된 경우 필요한 결과를 제공함).

예를 들어, 즉, 주어진 입력에 발생하는 상황 :

arr = [1,4,2,3,0,5,4,3] 
res = 7 

먼저 1 번호 (0 번째 요소)를 체크한다. 즉, 각 후속 요소 (4부터 시작하여 3으로 끝나는)가 추가되고 결과는 7과 비교됩니다. 알다시피, 해당 배열에 6이 없으므로 검색 결과가 나오지 않습니다.

그런 다음, 4 번호를 확인하고, 지금은 상황이 조금 더 재미있을 시작 :

4 + 2 = 6 // not added 
4 + 3 = 7 // added! 
4 + 0 = 4 // not added 
4 + 5 = 9 // not added 
4 + 4 = 8 // not added 
4 + 3 = 7 // added! 

그래서 검색이 당신에게 같은 요소 이쌍 제공 - [4, 3]합니다. 이제 명백한 ( 2, 5 쌍)을 생략하고 3 가자 :
3 + 0 = 3; // - 
3 + 5 = 8; // - 
3 + 4 = 7; // + 
3 + 3 = 6; // - 

이제 패턴을보고 시작이 반복 '3 첫째, 처음 4'의 쌍을 수집하지 않습니다 - 즉 이미 수집합니다. 그러나 그것이 수집 한 것은 first 3, second 4입니다. 두 가지 선택 모두 주어진 요구 사항을 따르는 것 같습니다.

===

두 번째 방법은 다소 이상합니다. 어떤 이유에서인지 작성자는 indexOf을 일정한 시간 복잡성 (힌트 : 아님)으로 단순한 조작으로 생각할뿐만 아니라 키 차이가 누락됩니다. indexOf은 정의에 따라 술어를 만족하는 첫 번째 요소를 얻습니다.

따라서, 예를 들어, reduce 기능 3 존재, 그 배열의 첫 번째 4을 통해 indexOf 검사를 진행

- 그리고 발견 3 첫째 :

// reduce on b = 4, index = 1 
search = 7 - 4; // 3 
searchIndex = arr.indexOf(3); // 3 

그러나 정확히 같은 쌍은 책을 때로 전환 첫 번째 3이 확인됩니다 (다시 indexOf은 첫 번째 4을 수집 함).

하지만이 쌍은 중복되지 않습니까? 예, 그렇습니다. 역설적이게도,이 오류는 다른 하나에 의해 보완됩니다 : 동일한 '첫 번째'를 두 번째로 다시 수집하는 경우 43.

// reduce on b = 4, index = 6 
search = 7 - 4; // 3 
searchIndex = arr.indexOf(3); // 3 

// reduce on b = 3, index = 7 
search = 7 - 3; // 4 
searchIndex = arr.indexOf(4); // 1 

예, 2 쌍이 더 발견되었습니다. 하나는 누락되었습니다. 배열의 마지막 요소는 쌍을 이루지 않습니다.

두 번째 방법을 고칠 수 있습니까?

let searchIndex = pairArr.indexOf(search, index + 1); 

을 ...하지만 이것은 단지는 독특한 요소와 배열 작업을 할 수 있습니다 : 물론, 당신은 조금 indexOf에 두 번째 인수를 공급하여 향상시킬 수 있습니다. 그렇지 않으면 여전히 명시적인 루프가 필요할 것이고 이는 기본적으로이 접근 방식을 첫 번째 항목을 훨씬 더 복잡하게 다시 작성하게합니다.

+0

설명에 감사드립니다. 귀하의 의견을 바탕으로 질문에 대답하는 이중 루프를 사용하여 첫 번째 예제입니까? –

+0

네, 맞습니다. – raina77ow

+0

두 가지 방법을 설명하는 시간을 보내 주셔서 감사합니다. –