#只出现一次的数字1, 其余数字都出现两次
def singleNumber(nums):
a = 0
for num in nums:
a = a^num
return a
print(singleNumber([1,1,2,2,3,3,8]))
#只出现一次的数字2, 其余数字都出现三次
#1.位运算求解此题;
#2.如果把所有出现三次的数字的二进制表示的每一位加起来,那么每一位都能被3整除;
#3.如果某一位的和能被3整除,那么只出现一次数字的二进制位中对应的那一位就是0,否则就是1;
def singleNumber2(nums):
bit = [0]*32
for j in range(32):
for i in range(len(nums)):
num = nums[i]>>j
bit[j] += num & 1
print(bit)
result = 0
for i in range(31,-1,-1): #相当于把一个32位二进制数转化为十进制
result <<= 1
result += bit[i]%3
return result
print(singleNumber2([1,1,1,2,2,2,3,3,3,7]))
class Solution(object):
# 通过这些不重复的元素和的三倍减去原来nums的和,得到的结果就是单个元素的两倍
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
set_nums = set(nums)
return (3*sum(set_nums)-sum(nums))//2
#有两个数字出现一次, 其余数字都出现二次
#先全部异或一次, 得到的结果, 考察其的某个非0位(比如最高非0位), 那么只出现一次的两个数中, 在这个位上一个为0, 一个为1, 由此可以将数组中的元素分成两部分,重新遍历, 求两个异或值
class Solution(object):
def singleNumber(self, nums):
acc = 0
for i in nums:
acc ^= i
print(acc)
print(bin(acc))
n = len(bin(acc))-3 #bin(8) '0b1000' 长度减3即右边有几个0
a,b = 0,0
for i in nums:
if i>>n&1:
a^=i
else:
b^=i
return b,a
s = Solution()
b,a = s.singleNumber([1,1,2,2,3,3,4,6])
print(b,a)