算法8 只出现一次的数字 leetcode136

题目

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:

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

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

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x21ib6/

想法

看起来很简单,确实很简单,但是没想到用新的方法(异或、set)
其实还可以按奇偶位置来做。。。

XOR、SET

//a^a=0;自己和自己异或等于0

//a^0=a;任何数字和0异或还等于他自己

//a^b^c=a^c^b;异或运算具有交换律

//有了这3个规律,这题就很容易解了,我们只需要把所有的数字都异或一遍,最终的结果就是我们要求的那个数字。来看下代码


public int singleNumber(int nums[]) {
    int result = 0;
    for (int i = 0; i < nums.length; i++)
        result ^= nums[i];
    return result;
}
public int singleNumber(int[] nums) {
    Set<Integer> set = new HashSet<>();
    for (int num : nums) {
        if (!set.add(num)) {
            //如果添加失败,说明这个值
            //在集合Set中存在,我们要
            //把他给移除掉
            set.remove(num);
        }
    }
    //最终集合Set中只有一个元素,我们直接返回
    return (int) set.toArray()[0];
}

作者:数据结构和算法
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x21ib6/?discussion=LIRNfM
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我的原始方法

class Solution {
    public int singleNumber(int[] nums) {
        Arrays.sort(nums);
        int k=nums[0];
        for(int i=0;i<nums.length-1;i++){
            if(nums[i]!=nums[i+1]) {
                if (i - 1 < 0 || nums[i] != nums[i - 1]) {
                    k = nums[i];
                }
                if (i+2==nums.length) {
                    k = nums[i+1];
                }
            }
        }
        return k;
    }
}
原文地址:https://www.cnblogs.com/impw/p/15484456.html