2017-10-26 2 views
1

나머지 요소가 두 번 나타나는 동안 배열에 한 번만 나타나는 숫자를 반환해야하는 경우 문제가 발생합니다. 이진 검색을 사용하여 할 수있는 일을했지만 첫 번째 테스트 케이스에 갇혀있었습니다. 내가 같은 것을 기록 할 수있을 때 그것이 왜 정의되지 않고 반환되는지 이해하지 못합니다. 무슨 일이 일어나는지 이해하도록 도와주세요.자바 스크립트에서 유효한 return 문을 사용하더라도 재귀 함수가 undefined를 반환합니다.

function singleNonDuplicate(nums) { 
    if(nums.length == 1) { 
    console.log(nums[0]); 
    return nums[0]; 
    } 

    if((nums[Math.floor(nums.length/2)] !== nums[Math.floor(nums.length/2) - 1]) && (nums[Math.floor(nums.length/2)] !==         nums[Math.floor(nums.length/2) + 1])) { 
     return nums[Math.floor(nums.length/2)]; 
    } 


    if(Math.floor(nums.length/2) % 2 == 0) { 
     if(nums[Math.floor(nums.length/2)] == nums[Math.floor(nums.length/2) - 1]) { 
      singleNonDuplicate(nums.slice(0, Math.floor(nums.length/2) - 1)); 
         console.log('g'); 
     } else { 
      singleNonDuplicate(nums.slice(Math.floor(nums.length/2) + 2)); 
         console.log('g'); 

     } 
    } else { 
     if(nums[Math.floor(nums.length/2)] == nums[Math.floor(nums.length/2) - 1]) { 
      console.log(nums.slice(Math.floor(nums.length/2) + 1)); 
      singleNonDuplicate(nums.slice(Math.floor(nums.length/2) + 1)); 
     } else { 
      console.log('g'); 
      singleNonDuplicate(nums.slice(0, Math.floor(nums.length/2))); 
     } 
    } 
} 

console.log(singleNonDuplicate([1,1,2])); 
+2

당신은 모든 재귀 지점에서 반환하지 않습니다. 'return singleNonDuplicate (....)' – epascarello

+1

재귀 호출 즉, singleNonDuplicate (nums.slice (Math.floor (nums.length/2) + 2))로 리턴을 시도하십시오. return singleNonDuplicate (nums.slice (Math.floor (nums.length/2) + 2))가됩니다. – FujiRoyale

답변

0

이 조금 떨어져 주제가 될 수도 있지만 XOR 사용하여 이런 문제로 고민을 할 수있는 더 나은 방법이있다 : 당신은 당신이 가지고 당신의 능 내에서 singleNonDuplicate를 호출 할 때

function appearsOnlyOnce(array) { 
    var single = array[0]; 
    for (var i=1; i<array.length; i++) { 
     single ^= array[i]; 
    } 
    return single 
} 
0

은 결과를 돌려 준다.

function singleNonDuplicate(nums) { 
 
    if(nums.length == 1) { 
 
    console.log(nums[0]); 
 
    return nums[0]; 
 
    } 
 

 
    if((nums[Math.floor(nums.length/2)] !== nums[Math.floor(nums.length/2) - 1]) && (nums[Math.floor(nums.length/2)] !==         nums[Math.floor(nums.length/2) + 1])) { 
 
     return nums[Math.floor(nums.length/2)]; 
 
    } 
 

 

 
    if(Math.floor(nums.length/2) % 2 == 0) { 
 
     if(nums[Math.floor(nums.length/2)] == nums[Math.floor(nums.length/2) - 1]) { 
 
      return singleNonDuplicate(nums.slice(0, Math.floor(nums.length/2) - 1)); 
 
         console.log('g'); 
 
     } else { 
 
      return singleNonDuplicate(nums.slice(Math.floor(nums.length/2) + 2)); 
 
         console.log('g'); 
 

 
     } 
 
    } else { 
 
     if(nums[Math.floor(nums.length/2)] == nums[Math.floor(nums.length/2) - 1]) { 
 
      console.log(nums.slice(Math.floor(nums.length/2) + 1)); 
 
      return singleNonDuplicate(nums.slice(Math.floor(nums.length/2) + 1)); 
 
     } else { 
 
      console.log('g'); 
 
      return singleNonDuplicate(nums.slice(0, Math.floor(nums.length/2))); 
 
     } 
 
    } 
 
} 
 

 
console.log(singleNonDuplicate([1,1,2]));

관련 문제