python找出只出现一次的数字_Python数组中只出现一次的数字
任何一個數字異或他自己都等于0,0異或任何一個數都等于那個數。數組中出了兩個數字之外,其他數字都出現兩次,那么我們從頭到尾依次異或數組中的每個數,那么出現兩次的數字都在整個過程中被抵消掉,那兩個不同的數字異或的值不為0,也就是說這兩個數的異或值中至少某一位為1。我們找到結果數字中最右邊為1的那一位i,然后一次遍歷數組中的數字,如果數字的第i位為1,則數字分到第一組,數字的第i位不為1,則數字分到第二組。這樣任何兩個相同的數字就分到了一組,而兩個不同的數字在第i位必然一個為1一個不為1而分到不同的組,然后再對兩個組依次進行異或操作,最后每一組得到的結果對應的就是兩個只出現一次的數字。'''
一個整型數組里除了兩個數字之外,其他的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。
'''
# -*- coding:utf-8 -*-
class Solution:
# 返回[a,b] 其中ab是出現一次的兩個數字
def FindNumsAppearOnce(self, array):
if array == None or len(array) <= 0:
return []
resultExclusiveOr = 0
for i in array:
resultExclusiveOr ^= i
indexOf1 = self.FindFirstBitIs1(resultExclusiveOr)
num1, num2 = 0
for j in range(len(array)):
if self.IsBit1(array[j], indexOf1):
num1 ^= array[j]
else:
num2 ^= array[j]
return [num1, num2]
def FindFirstBitIs1(self, num):
indexBit = 0
while num & 1 == 0 and indexBit <= 32:
indexBit += 1
num = num >> 1
return indexBit
def IsBit1(self, num, indexBit):
num = num >> indexBit
return num & 1
class Solution2:
# 返回[a,b] 其中ab是出現一次的兩個數字
def FindNumsAppearOnce(self, array):
if array == None or len(array) <= 0:
return []
resultExOr = self.ExOr(array)
i = 0
while resultExOr and i <= 32:
i += 1
resultExOr = resultExOr>>1
num1, num2 = [], []
for num in array:
if self.bitIs1(num, i):
num1.append(num)
else:
num2.append(num)
first = self.ExOr(num1)
second = self.ExOr(num2)
return [first, second]
def ExOr(self, aList):
ExOrNum = 0
for i in aList:
ExOrNum = ExOrNum ^ i
return ExOrNum
def bitIs1(self, n, i):
n = n >> (i-1)
return n & 1
aList = [2, 4, 3, 6, 3, 2, 5, 5]
s = Solution()
print(s.FindNumsAppearOnce(aList))
總結
以上是生活随笔為你收集整理的python找出只出现一次的数字_Python数组中只出现一次的数字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应用程序在哪里找(vs2010安装后找不
- 下一篇: 魂斗罗30条命怎么调 魂斗罗30条命方法