Leetcode-Single Number

Single NumberI

image.png

分析:這道題應該是很簡單了,直接使用異或運算,把重複出現的數字消掉剩下的就是出現一次的元素

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

image.png

分析:這種題型可以歸納爲一個數組中的元素某一元素只出現了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

image.png

分析:數組中的無關元素出現了偶數次,所以先考慮用異或將它們消除,得到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;
    }
}










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章