【腾讯精选练习50题】231. 2的幂(简单)

227 阅读1分钟

题目描述

给定一个整数,编写一个函数来判断它是否是 2 的幂次方。

示例 1:

输入: 1

输出: true

解释: 202^0 = 1

示例 2:

输入: 16

输出: true

解释: 242^4 = 16

示例 3:

输入: 218

输出: false

思路分析

  • 首先想得到的就是使用数学中的对数,如果 log2nlog_{2} {n}结果为整数,则说明n是2的幂次方
  • 然后看了评论之后,发现还有一种使用位运算(&)的解法。基于“如果是2的幂次方,那么这个数的二进制表示,只有一位是1,其他都是0”。
  • 那么就可以通过计算n、n-1与运算的结果判断。如n=8(00001000)、n-1 = 7 (00000111). 8 & 7 = 0(00000000)

AC代码

// 取对数。
// Java中Math只有以e或10为底的对数方法,可以通过换底公式log(x)(y) =log(e)(x) / log(e)(y)曲线救国
func isPowerOfTwo(n int) bool {
	if n <= 0 {
            return false
	}
	x := math.Log2(float64(n))
	return x == float64(int64(x))
}

// 与运算
func isPowerOfTwo(n int) bool {
	if n <= 0 {
            return false
	}
	return n&(n-1) == 0
}

总结

  • 解题时要多尝试不同方法,注意题目的考察点。比如这题用位运算更合适。