cocobear9  
一枚普通的zisuer(lll¬ω¬),努力每天多学一点点

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

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1
示例 2:

输入: [4,1,2,1,2]
输出: 4

链接:https://leetcode-cn.com/problems/single-number

首先是异或的三个性质,0和自己做异或操作结果仍然是自己,异或满足交换律和结合律是本题关键。时间复杂度O(n),空间复杂度(1)

public int singleNumber1(int[] nums) {
        int single=0 ;
        for(int num:nums) {
            single = single ^ num; 
        }
        return single;
    }

 

方法二哈希表:最容易想到的但是需要额外的空间

public int singleNumber(int[] nums) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int i : nums){
            map.put(i,map.getOrDefault(i,0)+1);
        }
        for(Map.Entry<Integer,Integer> entry: map.entrySet()) {
            if(entry.getValue()==1 ) {
                return entry.getKey();
            }
        }
        return -1 ;
    }

 

posted on 2020-05-13 17:28  cocobear9  阅读(208)  评论(0)    收藏  举报