これは、残りの要素が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]));
あなたはすべての再帰的なスポットから戻りません。 'return singleNonDuplicate(....)' – epascarello
再帰呼び出し、つまりsingleNonDuplicate(nums.slice(Math.floor(nums.length/2)+ 2))で返すようにしてください。 return singleNonDuplicate(nums.slice(Math.floor(nums.length/2)+ 2))になります。 – FujiRoyale