題目如下:(題目鏈接戳我)
給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例 1:
輸入: [2,2,1]
輸出: 1
示例 2:
輸入: [4,1,2,1,2]
輸出: 4
以下是我的解題思路:
思路一:
把所有出現的數據全部都放到一個 set 集合中,放之前判斷一下,如果 set 集合中有,就移除這個數據,因爲出現兩次的數據會經歷放入集合和移動集合,所以最後 set 集合中只剩下一個數據,就是我們需要的數據;
思路二:
這個思路是在我看了官方解題思路後整理的,先遍歷數組,把數組都放入 set 集合,只增加,不移除,並順便得出數組中所有數值的和 sum1;然後遍佈這個 set 集合,求出所有數值的和 sum2,再乘以 2, 這個時候,sum2 * 2 就比 sum1 多一個數,讓它們倆相減,得到的差就是我們所要的數據;
代碼如下:
class Solution {
//方法一
public int singleNumber(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int num: nums){
if(set.contains(num)){
set.remove(num);
}else{
set.add(num);
}
}
Iterator<Integer> iterator = set.iterator();
return iterator.next();
}
return -1;
}
//方法二
public int singleNumber2(int[] nums) {
Set<Integer> set = new HashSet<>();
int sum1 = 0, sum2 = 0;
for (int num: nums){
set.add(num);
sum1 += num;
}
for (int num : set) {
sum2 += num;
}
return sum2 * 2 - sum1;
}
}