【算法】数组:只出现一次的数字

130 阅读1分钟

题目:只出现一次的数字

leetcode链接:初级算法 - 只出现一次的数字

说明:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素

理解:

1、有一个非空数组,数组里有一个只出现一次以及多个出现2次的元素

2、找出仅出现一次的那个元素

思路:

1、使用异或运算,因为相同数字进行异或运算后结果为0,如:1 ^ 1 = 0;而0和其它数字进行异或运算后得到的还是那个数字

2、使用中间变量打标(boolean),取出值为true的key

3、利用set元素不重复特性删除重复元素,剩下就是只出现依次的数组元素

4、先对数组排序,然后利用奇偶数位置作判别

题解:

方案一:对数组元素进行异或运算,最终那个剩下的数字即为只出现一次的数组元素

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    var reduce = 0;
    for (var i = 0; i < nums.length; i++) {
        reduce =  reduce ^ nums[i];
    }
    return reduce;
};

image.png

方案二:

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    var obj = {};
    for (var i = 0; i < nums.length; i++) {
        if (!obj[nums[i]]) {
            obj[nums[i]] = true
        } else {
            obj[nums[i]] = false
        }
    }

    for (var key in obj) {
        if (obj[key]) {
            return key
        }
    }
};

image.png

方案三:

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    var set = new Set();
    for (var i = 0; i < nums.length; i++) {
        if (set.has(nums[i])) {
            set.delete(nums[i])
        } else {
            set.add(nums[i])
        }
    }
    return [...set][0]
};

image.png

方案四:利用奇偶数位置

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    nums.sort((n1, n2) => n1 - n2)
    // 排序之后只需要奇数位置和奇数位置+1对比即可,如果相等证明前一个不相等,如果全不相等证明在最后一个
    for (var i = 1; i < nums.length - 1; i += 2) {
            if (nums[i] === nums[i+1]) {
                    return nums[i - 1]
            }
    }

    return nums[nums.length - 1]
};

image.png

总结:

上面几种题解中,方案一如果了解的话,从代码层面来看是最简单的,但总体来说,效率似乎都不大高的样子