Leetcode 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?

题意:数组中只有一个数字出现了一次,其他都是成对出现的,求这个只出现了一次的数字。

思路:
这道题用哈希map或者哈希set都可以,但是需要额外的存储空间。
不需要额外存储空间的方法是位运算,用位运算异或的特性,相同数字异或为0,所有数组中成对出现的数字最后异或以后都是0,所以最后异或所有数字的结果就是那个只出现了一次的数字。

//哈希set
public int singleNumber(int[] nums) {
    if (nums == null || nums.length == 0 || nums.length % 2 == 0) {
        return 0;
    }

    int res = 0;

    HashSet set = new HashSet<>();
    for (int i : nums) {
        if (!set.add(i)) {
            set.remove(i);
        }
    }

    for (Integer i : set) {
        res = i;
    }

    return res;
}

//位运算
public int singleNumber(int[] nums) {
    if (nums == null || nums.length == 0 || nums.length % 2 == 0) {
        return 0;
    }

    int res = 0;
    for (int i : nums) {
        res ^= i;
    }

    return res;
}

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