这是一个问题,我需要返回一个只在数组中出现一次而其余元素出现两次的数字。使用二进制搜索我尽我所能,但我被困在第一个测试用例。当我能记录它时,我不明白为什么它会返回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]));
答案 0 :(得分:0)
这可能有点偏离主题,但使用XOR有更好的方法来解决这类问题:
function appearsOnlyOnce(array) {
var single = array[0];
for (var i=1; i<array.length; i++) {
single ^= array[i];
}
return single
}
答案 1 :(得分:0)
当你在你的函数中调用 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]));
&#13;