leetcode Day35 剑指专项 1-4

93 阅读1分钟

剑指 Offer II 001. 整数除法

var divide = function(a, b) {
    const INT_MIN = -Math.pow(2, 31)
    const INT_MAX = Math.pow(2, 31) - 1
    if (a == INT_MIN && b == -1) return INT_MAX
    let res = 0
    if (b == INT_MIN) {
        return a == b? 1 : 0;
    }
    if (a == INT_MIN) {
        a -= -Math.abs(b);
        res += 1;
    }
    const sign = (a > 0) ^ (b > 0) ? -1 : 1
    a = Math.abs(a)
    b = Math.abs(b)
    for (let x = 31; x >= 0; x--) {
        if ((a >>> x) - b >= 0) {
            a = a - (b << x)
            if (res > INT_MAX - (1 << x)) {
                return INT_MIN;
            }
            res = res + (1 << x)
        }
    }
    if (res == -2147483648) return -2147483648
    return sign == 1 ? res : -res
};

剑指 Offer II 002. 二进制加法

var addBinary = function(a, b) {
    let ml=Math.max(a.length,b.length)
    //padstart在前面补齐
    a=a.padStart(ml,'0')
    b=b.padStart(ml,'0')
    let i=ml-1
    let flag=0
    let res=''
    while(i>=0){
        flag = Number(a[i]) + Number(b[i]) + flag
        res=flag%2+res
        flag=Math.floor(flag/2)
        i--
    }
    res=flag==1?'1'+res:res
    return res
};

剑指 Offer II 003. 前 n 个数字二进制中 1 的个数

var countBits = function(n) {
    const res=[]
    for(let i=0;i<=n;i++){
        const n=i.toString(2)
        res.push(n.split('1').length-1)
    }
    return res
};

剑指 Offer II 004. 只出现一次的数字

var singleNumber = function(nums) {
    let map=new Map()
    for(let i of nums){
        map.set(i,map.has(i)?map.get(i)+1:1)
    }
    for(let [key,value] of map){
        if(value===1){
            return key
        }
    }
};