给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,3,2]
输出: 3
示例 2:
输入: [0,1,0,1,0,1,99]
输出: 99
思路:
- 数学方法:
3*(a+b+c)- (a+a+a+b+b+b+c) = 2c - 别人的思路:
定义两个变量ones和twos,当遍历nums的时候,对于重复元素x,第一次碰到x的时候,我们会将x赋给ones,第二次碰到后再赋给twos,第三次碰到就全部消除。赋值和消除的动作可以通过xor很简单的实现。
x&~x就完成了消除操作
第一次出现x记录在ones中,并且此时twos应为0;第二次出现x记录在twos中,同时ones置为0,;第三次出现x,则ones,twos均重置为0
#! /usr/bin/env python
#coding=utf-8
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
return (3 * sum(set(nums)) - sum(nums)) / 2
def singleNumber2(self, nums):
ones, twos = 0, 0
for num in nums:
ones = (ones^num)&~(twos)
twos = (twos^num)&~(ones)
return ones