第五届字节跳动青训营编程题样题的6种以上解法

描述

输入一个表示整数的字符串,判断这个字符串是否是4的幂。

输入

一个正整数字符串

输出

返回true或false

https://oj.juejin.cn/problem/04

如果我下面写的不清楚,可以直接参考力扣官方题解

https://leetcode.cn/problems/power-of-four/solution/4de-mi-by-leetcode-solution-b3ya/

方法一:4的幂

如果是4的幂,

首先,n%4 == 0

其次,n一直/4最后会==1,否则就是false

function isPowerOfFour(n) {
    if (n > 0 && n % 4 == 0) {
        while (n > 0) {
            n = n / 4
            if (n == 1) return true
            if (n == 0) return false
        }
    } else {
        return false
    }
}

方法二:2的幂

是4的幂首先是2的幂

首先,n&(n-1) == 0且n>0

其次,如果在这个基础上还是4的幂的话,满足n%3==1

function isPowerOfFour(n) {
    return (n & (n - 1)) == 0 && n > 0 && n % 3 == 1
}

方法三:利用二进制标识数

因为

4二进制 :100

16二进制:10000

64二进制:1000000

所以所有4的幂,1都在奇数位,那么和0xaaaaaaaa=10101010101010101010101010101010相与一定是0

function isPowerOfFour(n) {
    return (n & (n - 1)) == 0 && n > 0 && (n & 0xaaaaaaaa) == 0
}

拓展阅读

一些常用的二进制数

0xaaaaaaaa = 10101010101010101010101010101010 (偶数位为1,奇数位为0)

0x55555555 = 1010101010101010101010101010101 (偶数位为0,奇数位为1)

0x33333333 = 110011001100110011001100110011 (1和0每隔两位交替出现)

0xcccccccc = 11001100110011001100110011001100 (0和1每隔两位交替出现)

0x0f0f0f0f = 00001111000011110000111100001111 (1和0每隔四位交替出现)

0xf0f0f0f0 = 11110000111100001111000011110000 (0和1每隔四位交替出现)