題目描述為給定一非空的整數陣列,裡面有一個元素只出現一次(single number),其他都出現兩次。要我們找出 single numer。
題目有補充說明希望我們的時間複雜度為 O(N),且空間複雜度為 O(1)。
例子 1: [2,2,1], output=1。
例子 2: [4,1,2,1,2], output=4。
我們可以建立一組 map 來紀錄數字,若該元素出現一次則紀錄下來,當出現第二次時則從 map 刪去。最後檢查 map 中存在的數即可。
參考程式碼
func singleNumber(nums []int) int {
m:=make(map[int]bool)
for _,v:=range nums{
_,exist:=m[v]
if exist{
delete(m,v)
}else{
m[v]=true
}
}
for key:=range m{
if m[key]==true{
return key
}
}
return -1
}
我們可以利用 Day10-Missing Number 提過的解法 3,當對同一數進行兩次 XOR 運算時會抵銷,所以此題只需要對元素中所有數字做 XOR 運算,最終剩下來的數即為所求。
參考程式碼
func singleNumber(nums []int) int {
flag:=0
for _,v:=range nums{
flag^=v
}
return flag
}
解法 1 使用的空間複雜度為 O(N),未達到題目要求。然而當題目修改為各元素均出現 k 次,或者 single number 不只一個時,解法 1 只需要稍做修改。
解法 2 為昨天所提 bit operation 的應用。
我將解法1、2加上簡單的測試,上傳程式碼到此。