给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
第一次提交
想到的办法是先排序,然后就遍历,排序之后,(0,1),(2,3)(4,5)肯定是一样依次类推,不一样说明就找到了不重复的那个数
var singleNumber = function(nums) {
nums.sort();
let num = 0;
for (let i = 0; i < nums.length; i+=2) {
if(i === nums.length-1){
num = nums[i];
break;
}
if(nums[i] !== nums[i+1]){
num = nums[i];
break;
}
}
return num;
};
QQ截图20190321080750.png
第二次提交
第二次提交和第一次差不多,只是第一次是一个个找,遍历,第二次用二分法尝试找找看,不过结果性能并没有优化..
var singleNumber = function (nums) {
nums.sort();
return two(nums);
};
function two(nums) {
if (nums.length === 1)return nums[0];
let i = parseInt((nums.length - 1) / 2);
const oddFlag = i % 2 !== 0;
if (oddFlag) {
if (nums[i] === nums[i - 1]) {
nums.splice(0, i + 1);
return two(nums);
} else if (i === 0 || nums[i + 1] !== nums[i]) {
return nums[i]
} else {
nums.splice(i , nums.length - i );
return two(nums);
}
} else {
if (nums[i] === nums[i + 1]) {
nums.splice(0, i + 2);
return two(nums);
} else if (i === 0 || nums[i - 1] !== nums[i]) {
return nums[i]
} else {
nums.splice(i + 1, nums.length - i - 1);
return two(nums);
}
}
}
QQ截图20190321081845.png
最佳实现
容我细细品味
var singleNumber = function(nums) {
for (var i = 1; i < nums.length; i++) {
nums[0] = nums[0] ^ nums[i];
}
return nums[0];
};
网友评论