您好,登錄后才能下訂單哦!
Single NumberI
分析:這道題應該是很簡單了,直接使用異或運算,把重復出現的數字消掉剩下的就是出現一次的元素
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
分析:這種題型可以歸納為一個數組中的元素某一元素只出現了K次,而其他元素均出現了M次,然后求出出現K次的元素問題。如果K
為奇數M為偶數,就跟上面第一題是一樣的處理方式了;而其他情況則需要考慮使用位運算。我們知道,每個數字的二進制表示是一定的,所以我們通過計算每一位中1的個數,然后除3,若余數為0說明該位上為1的數都出現了三次,若余數不為0,說明我們要找的那個數字該位為1,通過移位運算實現上述過程。同理,若題目要求其他元素均出現了5次,就除5。
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 NumberIII
分析:數組中的無關元素出現了偶數次,所以先考慮用異或將它們消除,得到3和5的異或結果。然后我們考慮如何將3和5分離:3(011)和5(101)異或的結果為6(110),我們需要先找到3和5的二進制表示中不相同的一位,這里的方法就是6與-6進行相與,即110與其補碼(取反加一)011相與,得到010(即從右往左3和5的第二位不同),我們姑且將它稱為分離因子。然后遍歷整個數組,每個數與該分離因子相與可將數組分為&x==0和&x!=0的兩組,然后在每組內部進行異或運算,得到結果。
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; } }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。