算法题 | 判断一个数是不是4的幂(JS)
给定一个整数
n
,写一个函数来判断它是否是4 的幂次方
。如果是,返回true
;否则,返回false
。
方法一:
我们最容易想到的解题方式就是不断地除4,只要中间有一步4无法被整除,它就不是4的幂。如果这个整数除到最后是1,说明它是4的幂。
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfFour = function(n) {
if(n==0){
return false
}
while(n%4==0){
n=n/4
}
return n==1
};
方法二:
方法一还可以写成递归的形式:
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfFour = function(n) {
return n>0 && (n==1||(n%4==0&&isPowerOfFour(n/4)))
};
方法三:
4的幂为,4、16、64…这样的数。他们的二进制数为100
、10000
、1000000
这样的形式,我们可以发现第一位为1,其它位都为0,且0的个数是偶数个。
- 判断一个数只有最高位是1:
(n&(n-1)) == 0
- 判断一个数其它偶数个数都是0 => 这个数的1出现在偶数二进制位上(10000的1在第4位)=> 这个数和10101010101010101010101010101010的与,必然为0:
(n&0xAAAAAAAA ) == 0
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfFour = function(n) {
return n>0 && (n&(n-1))==0 && (n&0xAAAAAAAA)==0
};
方法四:
通过方法二中找到的规律,我们还可以通过正则表达式
来检测。
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfFour = function(n) {
const nstr = n.toString(2)
return /^1(00)*$/.test(nstr)
};
方法五:
4的幂一定是2的幂,这个数的最高位一定是1。其次,4的幂对3取模是1,4%3=1,8%3=2,16%3=1...
,所以对方法二可以再改一下。
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfFour = function(n) {
return n>0 && (n&(n-1))==0 && n%3==1
};
方法六:
n如果是4的幂,说明 根号n一定是2的幂。判断2的幂可以通过(n&(n-1))==0
和(n&(-n))==n
两种方式判断,所以也有两种写法。
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfFour = function(n) {
if(n<=0){
return false
}
let sqrtn = Math.floor(Math.sqrt(n))
return sqrtn*sqrtn==n && (sqrtn&(sqrtn-1))==0
};
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfFour = function(n) {
if(n<=0){
return false
}
let sqrtn = Math.floor(Math.sqrt(n))
return sqrtn*sqrtn==n && (sqrtn&(-sqrtn))==sqrtn
};