136. Single Number

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});
};

你可能感兴趣的:(136. Single Number)