一、题目描述
给你一个整数 n
,请你判断该整数是否是 2 的幂次方。如果是,返回 true
;否则,返回 false
。
如果存在一个整数 x
使得 n == 2^x
,则认为 n
是 2 的幂次方。
示例 1:
输入:n = 1 输出:true 解释:2^0 = 1
示例 2:
输入:n = 16 输出:true 解释:2^4 = 16
示例 3:
输入:n = 3 输出:false
提示:
-2^31 <= n <= 2^31 - 1
二、解题思路
一个整数是2的幂次方,当且仅当该整数满足以下两个条件:
- 该整数大于0。
- 该整数的二进制表示中只有一个1。
基于这个思路,我们可以使用位运算来解决这个问题。具体步骤如下:
- 首先判断n是否大于0。
- 然后使用位运算,将n与n-1进行按位与操作。如果n是2的幂次方,那么n的二进制表示中只有一个1,而n-1的二进制表示中,这个1变成0,其余位置都是1。因此,n & (n - 1)的结果应该是0。
三、具体代码
class Solution {public boolean isPowerOfTwo(int n) {// 判断n是否大于0if (n <= 0) {return false;}// 判断n与n-1按位与的结果是否为0return (n & (n - 1)) == 0;}
}
这段代码首先检查n是否大于0,如果不是,直接返回false。然后通过位运算判断n是否为2的幂次方。如果是,返回true;否则,返回false。
四、时间复杂度和空间复杂度
1. 时间复杂度
- 判断n是否大于0,这是一个常数时间的操作,记作O(1)。
- 计算 n & (n - 1) 并与0比较,这也是一个常数时间的操作,记作O(1)。
因此,整个算法的时间复杂度是O(1),即常数时间复杂度。算法的执行时间不依赖于输入数据的大小,而是固定的。
2. 空间复杂度
- 该算法在执行过程中没有使用额外的存储空间,除了几个用于计算和判断的变量(n, n-1和结果),这些变量占用的空间是固定的,不随输入数据的大小而变化。
因此,算法的空间复杂度是O(1),即常数空间复杂度。算法的内存使用量不依赖于输入数据的大小,而是固定的。
五、总结知识点
-
类定义:
class Solution
:定义了一个名为Solution
的类。
-
方法定义:
public boolean isPowerOfTwo(int n)
:定义了一个公共方法isPowerOfTwo
,它接受一个整型参数n
并返回一个布尔值。
-
条件判断:
if (n <= 0)
:使用了if
语句进行条件判断,检查变量n
是否小于或等于0。
-
返回值:
return false;
:在条件判断为真时,立即返回false
。return (n & (n - 1)) == 0;
:在条件判断为假时,执行按位与操作,并根据结果返回true
或false
。
-
位运算:
&
:按位与运算符,对两个操作数的每一位进行与操作,只有两个对应的位都为1时,结果位才为1,否则为0。n & (n - 1)
:这是一个常见的技巧,用于判断一个整数是否是2的幂。如果是2的幂,那么它的二进制表示中只有一个1,减去1之后,这个1变成0,其余位置保持不变,按位与的结果应该是0。
-
逻辑运算:
==
:等于运算符,用于比较两个值是否相等。
-
整型变量:
int n
:定义了一个整型变量n
,用于接收输入的整数。
以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。