Single NumberI
java
分析:這道題應該是很簡單了,直接使用異或運算,把重複出現的數字消掉剩下的就是出現一次的元素數組
lass Solution { public int singleNumber(int[] nums) { int tmp = nums[0]; for(int i = 1;i < nums.length;i++){ tmp = tmp ^ nums[i]; } return tmp; } }
Single NumberII
ide
分析:這種題型能夠概括爲一個數組中的元素某一元素只出現了K次,而其餘元素均出現了M次,而後求出出現K次的元素問題。若是Kspa
爲奇數M爲偶數,就跟上面第一題是同樣的處理方式了;而其餘狀況則須要考慮使用位運算。咱們知道,每一個數字的二進制表示是必定的,因此咱們經過計算每一位中1的個數,而後除3,若餘數爲0說明該位上爲1的數都出現了三次,若餘數不爲0,說明咱們要找的那個數字該位爲1,經過移位運算實現上述過程。同理,若題目要求其餘元素均出現了5次,就除5。it
class Solution { public int singleNumber(int[] nums) { int ans = 0; for(int i = 0 ; i < 32 ; i++){ int sum = 0; for(int j = 0 ; j < nums.length ; j++){ if(((nums[j] >> i) & 1) == 1 ){ sum++; sum %= 3; } } if(sum != 0){ ans |= sum << i;//將循環中右移的位移回原位置 } } return ans; }
Single NumberIIIio
分析:數組中的無關元素出現了偶數次,因此先考慮用異或將它們消除,獲得3和5的異或結果。而後咱們考慮如何將3和5分離:3(011)和5(101)異或的結果爲6(110),咱們須要先找到3和5的二進制表示中不相同的一位,這裏的方法就是6與-6進行相與,即110與其補碼(取反加一)011相與,獲得010(即從右往左3和5的第二位不一樣),咱們姑且將它稱爲分離因子。而後遍歷整個數組,每一個數與該分離因子相與可將數組分爲&x==0和&x!=0的兩組,而後在每組內部進行異或運算,獲得結果。
class
class Solution { public int[] singleNumber(int[] nums) { int diff = 0; for(int num : nums) { diff ^= num; } diff &= -diff; int[] res = new int[]{0,0}; for(int i : nums) { if((diff & i) == 0) { res[0] ^= i; } if((diff & i) != 0) { res[1] ^= i; } } return res; } }