Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. > Could you implement it without using extra memory?
整數型數組中,每個元素均出現兩次,除了一個元素例外,如何找出這個元素?能否設計一個線性時間的算法,且不需要額外的存儲空間?
解題思路
(1)O(n^2)的解法
對元素的出現次數進行統計,可進行n*n循環,判斷元素是否只出現了一次。這樣時間複雜度爲O(n^2), 不需要額外空間
先對元素進行排序,然後進行相鄰兩元素的對比,如a1和a2對比,a3和a4對比,如果不同,則前一個元素(a1、a3)就是所要查找的元素。
給出第二種想法的代碼
class Solution:
# @param A, a list of integer
# @return an integer
def singleNumber(self, A):
A.sort()
for i in range(1, len(A), 2):
if A[i] != A[i-1]: # 與前一元素對比
return A[i-1]
return A[-1] # 要找的元素是最後一個元素
實現上主要就是相鄰兩元素的對比,循環間隔爲2,與前一元素對比,如果不同,則返回前一元素。
如果循環執行完沒有返回,則返回列表中最後一個元素,如[1, 1, 2, 2, 3],執行的循環爲(1, 3),在循環中最後一個元素不會參與對比(奇數個元素)
(2)O(n)的解法
發現了一個很有意思的解決方式:利用XOR運算,就是異或
因爲A XOR A = 0,且XOR運算是可交換的,於是,對於實例{2,1,4,5,2,4,1}就會有這樣的結果:
(2^1^4^5^2^4^1) => ((2^2)^(1^1)^(4^4)^(5)) => (0^0^0^5) => 5
就把只出現了一次的元素(其餘元素均出現兩次)給找出來了!
算法複雜度爲O(n),且不需要額外空間,代碼如下:
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
result = 0
for i in nums:
result^=i
return(result)