劍指offer:js實現二進制中1的個數

題目:給出一個整數,求出這個數轉換成二進制中出現1的個數

思路:n&(n-1) 可以消掉末尾的一個1,循環直到0爲止

常規解法不應該使用n來作爲右移,負數右移0x80000000變成0xC000000
C = 1100 8 = 1000

function f(n){
    let i = 0;
    while(n!=0){
        n = n&(n-1)
        i++;
    }
    return i;
}    

延伸:判斷一個整數是不是2的整數次方
2的整數次方的二進制只有一個位是1
n&(n-1) == 0 則能判斷

延伸2:9個數分別在1-10中,但是缺失了一個數字,找出缺失的這個數
比如5,4,3,6,7,8,9,1,2 缺少了10.

    function f(arr,n){
        let sum = 0;
        arr.forEach(item=>{
            sum^=item;
        });
        let sum2 = 0;
        for(let i = 1;i<=n;i++){
            sum2 ^= i;
        }
        return sum^sum2;
    }

因爲自己和自己異或是0 0和自己異或是本身,所以異或可以解
這題也可以使用累加之後相減也能解決。

延伸3:一個整數數組,有兩個整數是奇數個數,其他的個數都是偶數個數 求出這兩個奇數個數的數
比如:[1,2,3,1] 2,3個數爲奇數個

    function f3(arr){
        let sum = 0;
        arr.forEach(item=>{
            sum^=item;
        })
        let t = sum&(-sum);//n & -n 可以得到右邊第一個1
        let sum2 = 0;
        sum = 0;
        arr.forEach(item=>{
            if((item&t) == 0){
                sum^=item
            }else{
                sum2^=item
            }
        })
        console.log(sum,sum2);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章