對於這個問題,最暴力的求解方法是採用遍歷的操作,然後全部進行,以下方法使用了乙個輔助類,其原理是乙個智慧型容器,當插入元素的時候判斷集合中是否已經有了該元素,沒有就新增,有的話就刪除,如下
#!/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個數,其中有且僅有兩個出現了奇數次,其餘的...