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

说明:

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

示例 1:

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

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

巧用集合

1
2
3
4
5
6
7
8
class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        #首先使用的是集合去除了重复的值,然后进行了加和.因为这个 nums 是奇数个,因为有一个是只出现一次的.因此去除了重复的值后累加乘上2倍,再减掉原来的数组的加和就是剩下的那个没有出现两次的元素的值
        return sum(set(nums))*2-sum(nums)  #这么太牛逼的做法了

异或

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        # 使用异或的方式
        # 相同的数字异或结果是0
        # 任何数字与0异或是自己本身
        ans = 0
        for num in nums:
            ans ^=num
        return ans
    #这里利用就是不管什么数只要是异或两次想相当于没有被异或过,因此使用0作为初始的异或值,出现两次的元素全部被异或掉了
    #出现一次的跟0异或就是自己本身

test

1
2
0^2^3^2
Out[22]: 3