136. 只出現一次的數字
阿新 • • 發佈:2020-10-09
一、題目
給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例 1:
輸入: [2,2,1]
輸出: 1
示例 2:
輸入: [4,1,2,1,2]
輸出: 4
二、題解
1. 異或
class Solution { public int singleNumber(int[] nums) { int result = 0; for (int i = 0; i < nums.length; i++) { result ^= nums[i]; } return result; } }
-
不需要額外的空間是指的演算法的空間複雜度為O(1)級別
-
異或運算滿足交換律
-
任何數異或0都是原數——0^A=A
-
result = 0; result ^ 2 = 2;
-
-
兩個相同的數異或為0——A^A=0
-
2 ^ 2 = 0;
-
-
因此一個數字異或同一個數兩次還是原數——ABB=A
-
result = 2; 2 ^ 2 = 0; 0 ^ 2 = 2;
-
2. 先排序後比較
class Solution { public int singleNumber(int[] nums) { //氣泡排序 int temp = 0; for (int i = 0; i < nums.length-1; i++){ for (int j = 0; j < nums.length-1; j++) { if (nums[j]>nums[j+1]) { temp = nums[j]; nums[j] = nums[j + 1]; nums[j + 1] = temp; } } } //兩兩比較,不一樣就跳出迴圈輸出那個數 temp = nums[0]; for (int i = 0; i < nums.length-2; i+=2) { if(temp==nums[i+1]){ temp = nums[i+2]; }else { break; } } return temp; } }