Given an array of integers, every element appears twice except for one. Find that single one.
Note:Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
这个数组里所有的元素都会出现两次,只有一个会出现1次,找出这个元素。
比较直观的想法是,建一个Map,第一个出现的时候记录下来,第二次出现时把这个键删了,这样最后剩下在Map里的就是我们需要的那个了。
var singleNumber = function(nums) {
var map = {};
for (var i = 0, len = nums.length; i < len; i++) {
var key = nums[i];
if (!map[key]) {
map[key] = true;
}
else {
delete map[key];
}
}
for (var i in map) {
return +i;
}
};
不过这个方法有个问题,Map占了额外的储存空间。
还有一个方法,两个数异或,两个数相同就会是0,那么这几个数异或会发生什么:1,2,1,3,2,5,4,3,4。答案是5。
啊,那我们把数组里所有的元素异或起来就好啦。
var singleNumber = function(nums) {
for (var i = 1;i < nums.length;i++) {
nums[i] = nums[i]^nums[i-1];
}
return nums[nums.length-1];
};
JS数组对象有一个神奇的方法reduce:
var singleNumber = function(nums) {
return nums.reduce(function(a,b){return a^b});
};