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<Integer> 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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容