LeetCode 12.9

94 阅读1分钟

191.位1的个数

//toString(radix),radix表示该数字的基数,如果不设置,就默认基数为10,1011就会被转成11(2^3+2+1)。
var hammingWeight = function(n) {
    n= n.toString(2);
    let res = 0;        
    for(let i of n){
        i=='1'&&res++;
    }
    return res;
};
//位运算,减一做位与运算,就能从后往前消除1。
var hammingWeight = function(n) {
    let res = 0;
    while(n){
        n = n&(n-1);
        res++
    }
    return res;
};

461.汉明距离

//暴力
var hammingDistance = function(x, y) {
    let res = 0;
    while(x!==0||y!==0){
        if(x%2!==y%2){
            res++;
        }
        x = Math.floor(x/2);
        y = Math.floor(y/2);
    }
    return res;
};
//位运算
var hammingDistance = function(x, y) {
    let s = x^y;
    let res = 0;
    while(s!==0){
        res += s&1;
        s>>=1;
    }
    return res;
};
//Brian Kernighan 算法,跳过了0。
var hammingDistance = function(x, y) {
    let s = x^y;
    let res = 0;
    while(s!==0){
        s &= s-1
        res++;
    }
    return res;
};

190.颠倒二进制位

//真的会考位运算吗。res如果不<<<0就会在n=11111111111111111111111111111101时出现负数。
var reverseBits = function(n) {
    let res = 0;
    for (let i = 0; i < 32 && n > 0; ++i) {
        res |= (n & 1) << (31 - i);
        n >>>= 1;
    }
    return res >>> 0;
};

118.杨辉三角

//之前做过了
var generate = function(numRows) {
    let res = [];
    let init = [1];
    res.push(init);
    let left=0;
    let right=0;
    let index = 0;
    for(let num=2;num<=numRows;num++){
        let store = [];
        for(let i=0;i<=res[index].length;i++){
            index = num-2;
            left = i===0?0:res[index][i-1];
            right = i<res[index].length?res[index][i]:0;
            store.push(left+right);
            
        }
        res.push(store);
    }
    return res;
};

20.有效的括号

//同上
var isValid = function(s) {
    let stack = [];
    for(let i of s){
        let back = stack.length-1;
        if(back<0){ stack.push(i)}
        else{
            let code1 = stack[back].charCodeAt();
            let code2 = i.charCodeAt();
            // console.log(code1,code2);
            let store = code2-code1;
            if(store===1||store===2){
                stack.pop();
            }
            else{
                stack.push(i);
            }
        }
    }
    return stack.length===0;
};

268.丢失的数字

//就是要自信
var missingNumber = function(nums) {
    let n = nums.length;
    n = n*(n+1)/2;
    for(let i of nums){
        n -= i;
    }
    return n;
};
//太高级了,我直接搬运
var missingNumber = function(nums) {
    let res = nums.length;
    for(let i in nums){
        i = parseInt(i);
        res ^= nums[i];
        res ^= i;
    }
    return res;
};