2017-10-26 3 views
1

これは、残りの要素が2回現れるうちに配列に1回だけ現れる数値を返す必要がある場合に問題になります。バイナリ検索を使って私はできることをしましたが、私は最初のテストケースで立ち往生していました。私は同じことを記録できるとき、なぜそれが未定義に戻っているのか分かりません。何が起こっているのか理解してください。再帰関数は、javascriptで有効なreturn文を使用しても未定義を返します。

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を使用してこの種の問題を行うにはもっと良い方法があります:

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

あなたのfunctio内からsingleNonDuplicateを呼び出すと、あなたがする必要があります結果を返します。

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

関連する問題