找出2N 1個兩兩配對數中落單那個

2021-06-26 22:46:51 字數 1258 閱讀 6709

對於這個問題,最暴力的求解方法是採用遍歷的操作,然後全部進行,以下方法使用了乙個輔助類,其原理是乙個智慧型容器,當插入元素的時候判斷集合中是否已經有了該元素,沒有就新增,有的話就刪除,如下

#!/usr/bin/python

def findsingle(ls):

con = container()

for i in range(len(ls)):

con.add(ls[i])

con.showresult()

class container:

def __init__(self):

self.data =

self.count = 0

def add(self,dat):

if self.count > 0:

flag = false

index = 0

for i in range(self.count):

if self.data[i] == dat:

flag = true

index = i

break

if flag:

del self.data[index]

self.count = self.count - 1

else:

self.count=self.count + 1

elif self.count == 0:

self.count = self.count + 1

def showresult(self):

for i in range(len(self.data)):

print self.data[i]

if __name__=="__main__":

ts = [1,2,1,2,3,4,3]

findsingle(ts)

當時我就拿著這個演算法給面試官看,面試官不是很滿意,後來回來查詢了一下,有個比較簡單的辦法,那就是採用異或操作

#!/usr/bin/python

def findsingle(lt):

l = len(lt)

ret = 0

for i in range(l):

ret^=int(lt[i])

return ret

if __name__=="__main__":

ts = "12123447887"

print findsingle(ts)

找出2n 1個數中不成對的那個

問題定義 有2n 1個數,只有乙個單著,別的都是成對的,找出這個單著的數。比如 2 1 3 2 1。3是答案。思路一 暴力搜尋 每個數都和其他數比較,找不到相同的,就得到了結果。時間複雜度為o n2 思路二 排序搜尋 先給序列排個序,之後從前往後一對一對的找,直到不是成對的為止。時間複雜度,怎麼也得...

找出2n 1個數中不成對的那個

用o n 複雜度搞定。異或操作 對於位操作 相同為0,相異為1.比如 1 0 1,1 1 0 這樣 對於2,1,3,2,1,2 2 1 1 3 3.如此就能將不成對的3找出來。異或具有交換律,所以可以按順序計算,2 1 3 2 1 3。如下 include include include int a...

找出2n 1個數中不成對的那個 公升級版

上篇談到了用異或來解決,確實是個好方法,時間複雜度為o n 比例一遍ok,空間複雜度為o 1 只占用乙個空間足矣。現在把這個問題公升級下 1 給出n個數,其中有且僅有乙個出現了奇數次,其餘的都出現了偶數次。用線性時間常數空間找出這個出現奇數次的數 2 給定n個數,其中有且僅有兩個出現了奇數次,其餘的...