LeetCode(136)只出现一次的数字[数组]

211 阅读1分钟

只出现一次的数字

Given a non-empty 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?

要求:时间复杂度O(n),空间复杂度O(1)

我在做的时候只想到第一种解法,使用Map进行存储,然后判断key是否出现过,出现过则删除,但是这样会导致空间复杂度为O(n),其实下面是第一种解法:

  • 方法一
class Solution {
    public int singleNumber(int[] nums) {
         Map<Integer,Integer> map = new HashMap<>();
        for (int i = 0;i<nums.length;i++){
            if (map.containsKey(nums[i])){
                map.remove(nums[i]);
                continue;
            }
            map.put(nums[i],i);
        }
        Iterator iterator = map.entrySet().iterator();
        Integer key = 0;
        while (iterator.hasNext()){
            Map.Entry entry = (Map.Entry) iterator.next();
            key = (Integer) entry.getKey();
        }
        return key;
    }
}
  • 方法二

    先贴上代码,是不是非常简单

    class Solution {
        public int singleNumber(int[] nums) {
            int number = 0;
            for (int num: nums){
                number = number ^ num;
            }
    
            return number;
        }
    }
    

    这里需要用到xor(异或)运算,应用于逻辑运算,数组符号为“⊕”,二进制中0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1)