給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例 1:
輸入:[2
,2,1
]輸出:
1
示例 2:
輸入:[4
,1,2
,1,2
]輸出:
4
用乙個字典來儲存訪問過的數字(鍵),以及該數字出現的次數(值)。首先,遍歷陣列構建字典。然後,遍歷字典,找出值為1對應的鍵,即為只出現一次的數字。
class
solution
else
// 第二次遍歷該數字
map.
put(nums[i],2
);}int key =0;
int value =0;
iterator it = map.
entryset()
.iterator()
;while
(it.
hasnext()
)}return key;
}}
依次遍歷陣列元素,並將該元素存入集合中,如果該集合已經存在該元素,則將該元素刪除。
遍歷完陣列,最後集合只剩下乙個元素,即為只出現一次的數字。
class
solution
int num =0;
for(
int a: set)
num = a;
// 獲取只出現一次的數字
return num;
}}
由2*(a+b+c) - (a+a+b+b+c) = c
,可得:陣列中的數字組成的集合的數字和的2倍,減去陣列數字和,即為只出現一次的數字。
class
solution
int sum2 =0;
for(
int a: set)
// 計算集合的數字和
sum2 += a;
return sum2*
2- sum1;
// 2*(a+b+c) - (a+a+b+b+c) = c
}}
按位異或運算滿足:
a ^ 0 = a
a ^ a = 0
交換律和結合律:a ^ b ^ c ^ b ^ c = a ^ (b ^ b) ^ (c ^ c) = a ^ 0 ^ 0 = a ^ 0 = a
所以,只需要陣列中的所有元素,一起做異或運算,即可得到最終的結果。
class
solution
}
如有不當之處,歡迎讀者批評指正! 136 只出現一次的數字
一.題目 給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2,2,1 輸出 1示例 2 輸入 4,1,2,1,2 輸出 4二.思路及 法1.使用hash tab...
136 只出現一次的數字
給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2,2,1 輸出 1 示例 2 輸入 4,1,2,1,2 輸出 4 異或運算滿足交換律,如a b c等同於c b...
136 只出現一次的數字
給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2,2,1 輸出 1 示例 2 輸入 4,1,2,1,2 輸出 4 c int singlenumber int...