第五届字节跳动青训营编程题样题的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每隔四位交替出现)