9-algorithm二的整数次幂

264 阅读1分钟

判断输入的数值是否是2的整数次幂?

判断输入的数值是否是2的整数次幂

isPowerOfTwo(8); // true
isPowerOfTwo(5); // false
算法的突破口:
用2区分解输入的数字以及被分解出来的结果,直到得到的商为1,
并且判断它的玉树是否为0

while循环实现 isPowerOfTwo

function isPowerOfTwo(number) {
    if (number < 1) {
        return false;
    }
    let dividedNumber = number;
    while (dividedNumber !== 1) {
        if (dividedNumber % 2 !== 0) {
            return false;
        }
        dividedNumber = dividedNumber / 2;
    }
    return true;
}
// 时间复杂度
// 最好情况: 13 => O(1)
// 平均情况: O(log n)
// 最差情况: 1125899906842624 => O(log n)  先快后慢的情况

使用按位与运算-性能优化


// 进制转换 https://tool.lu/hexconvert/
// 使用按位与运算-性能优化
// 按位与运算
// 在二进制里面:(1000 & 0111) === 0000 => 0
// 在二进制里面:(10 & 01) === 0 => 0
// 十进制:03 === 011
// 十进制:04 === 100

// 十进制:07 === 01111
// 十进制:08 === 10000

// 十进制:15 === 011111
// 十进制:16 === 100000

// 十进制:31 === 0111111
// 十进制:32 === 1000000
function isPowerOfTwo(number) {
    if (number < 1) {
        return false;
    }

    return (number & (number - 1)) === 0;
}
// T : O(1) 常数时间复杂度

console.log('isPowerOfTwo(3)', isPowerOfTwo(3));
console.log('isPowerOfTwo(4)', isPowerOfTwo(4));
console.log('isPowerOfTwo(5)', isPowerOfTwo(5));
console.log('isPowerOfTwo(8)', isPowerOfTwo(8));
console.log('isPowerOfTwo(9)', isPowerOfTwo(9));
console.log('isPowerOfTwo(12)', isPowerOfTwo(12));
console.log('isPowerOfTwo(13)', isPowerOfTwo(13));

// isPowerOfTwo(3) false
// isPowerOfTwo(4) true
// isPowerOfTwo(5) false
// isPowerOfTwo(8) true
// isPowerOfTwo(9) false
// isPowerOfTwo(12) false
// isPowerOfTwo(13) false
// isPowerOfTwo(16) true