題目描述:
給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
分析:
也就是說,一個非空數組中的元素只有一個元素只出現一次,其他都是成對出現的,現在就是要找出這個單飛的元素。
解法:
方法一:使用Set
思路:利用Set接口的特點:相同的值只能插入一次。
將數組裏的每一個元素從前往後依次添加到set中,如果返回值是false,則表示set中已經有了該元素,所以將set中的這個元素刪掉;反之將元素插入set中。
代碼:
class Solution {
public int singleNumber(int[] nums) {
Set<Integer> s=new HashSet<>();
for(int i=0;i<nums.length;i++)
{
//如果添加成功了表示只有一個
//如果添加不成功就把set裏邊的刪掉
if(!s.add(nums[i]))
{
s.remove(nums[i]);
}
}
Object[] o=s.toArray();
return (int)o[0];
}
}
分析:該算法的空間複雜度爲O(N),時間複雜度爲O(N);效率不是很好,但還有另一種比較巧合的方法空間複雜度達到O(1);
方法二:異或
我們都知道異或的結論:相同爲0,不同爲1
所以比如 [1 2 2 4 1],如下圖異或結果爲:4
代碼:
class Solution {
public int singleNumber(int[] nums) {
int tmp=0;
for(int i=0;i<nums.length;i++)
{
tmp^=nums[i];
}
return tmp;
}
}
分析:通過異或的結論來實現該算法空間複雜度爲O(1)。