Leetcode-Single Number

Single NumberI
java

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
ide

image.png

分析:這種題型能夠概括爲一個數組中的元素某一元素只出現了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

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

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;
    }
}
相關文章
相關標籤/搜索