By letting go of something, your arms are free to grab hold of something else.
學會放手,才能獲得更多。
給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?
示例 1:
示例 2:
這題說的是只有一個數出現了一次,其他數字都出現了2次,讓我們求這個只出現一次的數字。這題使用位運算是最容易解決的,關於位運算有下面幾個規律
1^1=0;
1^0=1;
0^1=1;
0^0=0;
也就說0和1異或的時候相同的異或結果為0,不同的異或結果為1,根據上面的規律我們得到
a^a=0;自己和自己異或等於0
a^0=a;任何數字和0異或還等於他自己
a^b^c=a^c^b;異或運算具有交換律
有了這3個規律,這題就很容易解了,我們只需要把所有的數字都異或一遍,最終的結果就是我們要求的那個數字。來看下代碼
1public int singleNumber(int nums[]) {
2 int result = 0;
3 for (int i = 0; i < nums.length; i++)
4 result ^= nums[i];
5 return result;
6}
這個應該是最容易想到的,我們遍歷數組中的元素,然後在一個個添加到集合Set中,如果添加失敗,說明以前添加過,就把他給移除掉。當我們把數組中的所有元素都遍歷完的時候,集合Set中只會有一個元素,這個就是我們要求的值。
1public int singleNumber(int[] nums) {
2 Set<Integer> set = new HashSet<>();
3 for (int num : nums) {
4 if (!set.add(num)) {
5 //如果添加失敗,說明這個值
6 //在集合Set中存在,我們要
7 //把他給移除掉
8 set.remove(num);
9 }
10 }
11 //最終集合Set中只有一個元素,我們直接返回
12 return (int) set.toArray()[0];
13}
還有一種解題思路就是使用HashMap來統計,但無論哪種方式都沒有位運算來的快。
長按上圖,識別圖中二維碼之後即可關注。
如果覺得有用就點個"贊"吧