Problem: 136. 只出现一次的数字


文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code


思路

  • 最暴力的想法是遍历+查数(list.count方法),此时时间复杂度为136. 只出现一次的数字_空间复杂度,空间复杂度为136. 只出现一次的数字_时间复杂度_02
  • 可以用哈希表优化,python的set和dict基于哈希表,所以可以用来计数。对于set而言,遍历数组,如果该数不在set中,则将该数加到set中,否则删掉,最终留在set中的一定是只出现一次的元素。dict用来计数即可。需要注意的是set和dict的in方法时间复杂度都是136. 只出现一次的数字_时间复杂度_03。此时时间复杂度为136. 只出现一次的数字_时间复杂度_02,空间复杂度为136. 只出现一次的数字_时间复杂度_02
  • 最优解是利用异或运算

136. 只出现一次的数字_异或运算_06

解题方法

异或运算

  1. 任何数与0进行异或仍然是本身
  2. 任何数与自身异或等于0
  3. 异或运算满足交换律和结合率

复杂度

时间复杂度: 136. 只出现一次的数字_算法_07

空间复杂度: 136. 只出现一次的数字_空间复杂度_08

Code

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        '''
        异或的性质:
            1. 任何数与0异或仍然等于本身
            2. 任何数与自身异或等于0
            3. 异或满足交换律和结合律

        成对出现的数据会与自身异或,变为0
        只有出现一次的数据会与0异或,返回本身
        '''

        x = 0
        for i in nums:
            x ^= i
        return x