【LeetCode】#136. 只出现一次的数字

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

说明:

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

示例 1:

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

示例 2:

输入: [4,1,2,1,2]
输出: 4
方法一:暴力!!!
    public int singleNumber(int[] nums) {
        for(int i = 0; i < nums.length; i++){
            for(int j = 0; j < nums.length; j++){
                if(nums[i] == nums [j] && i != j){
                    break;
                }else{
                    if (j == nums.length - 1){
                        if(i == j){
                            return nums[i];
                        }else{
                            if(nums[i] == nums [j])break;
                            else{
                                return nums[i];
                            }
                        }
                    }
                    if (nums[i] != nums [j] && i != j){
                        continue;
                    }
                }
            }
        }
        return -1;
    }
方法二:哈希表判断是否只出现一次
    public int singleNumber(int[] nums) {
        Map<Integer,Integer> map = new HashMap<Integer,Integer>();
        for(int i:nums){
            Integer count = map.get(i);
            count = count == null ? 1 : ++count;
            map.put(i,count);
        }
        for(int i:map.keySet()){
            int count = map.get(i);
            if(count == 1){
                return i;
            }
        }
        return -1;
    }
方法三:无敌位运算
因为a^a=0  a^0=a
class Solution {
    public int singleNumber(int[] nums) {
        int single = 0;
        for (int num : nums) {
            single ^= num;
        }
        return single;
    }
}

知识点:

位运算异或^:a^a=0   a^0=a

具体位运算链接:位运算(&、|、^、~、>>、 | 菜鸟教程 (runoob.com)

总结:

多思考,使用运算效率最高。