给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
输入: [2,2,1]
输出: 1
输入: [4,1,2,1,2]
输出: 4
思路1
let singleNumber = function(nums) {
for (let i = 1; i < nums.length; i++) {
nums[0] = nums[0] ^ nums[i]; // 把所有的元素都异或到nums[0]上。
}
return nums[0];
};
或者
let singleNumber = function(nums) {
return nums.reduce((i, j) => i ^ j);
};
思路2
let singleNumber = function(nums) {
nums.sort((a,b) => a - b);
let len = nums.length;
for (let i=0; i<len; i=i+2){
if(nums[i]!=nums[i+1]){
return nums[i];
}
}
};
思路3
let singleNumber = function(nums) {
let obj = {},result;
for(let i in nums) {
if(obj[nums[i]]) {
obj[nums[i]]++;
}else{
obj[nums[i]] = 1;
}
}
for(let i in obj){
if(obj[i] === 1){
result = i
}
}
return result
};
如果我修改了题目 把二次改为多次
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两 多
次。找出那个只出现了一次的元素。
思路1
存在问题 如果传入数据是[9,9,9,8] 则输出结果和预期不一致 输出结果为1。
首先我们了解一下异或。
异或运算法则:两位不同,结果为"1",否则为0
9 二进制 1001
8 二进制 1000
1001^1001 结果为0
0 ^ 1001 结果为 1001
1001 ^ 1000 结果为 0001 为十进制1
思路 2 不可行
思路 3
没有问题