一. 题231: 2的幂
-
题目
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 -
解题代码
public boolean isPowerOfTwo(int n) { if(n <= 0) { return false; } // 方法一: 统计有多少位是1, 当只有一位1时, 就是2的幂 // int sum = 0; // for(int i = 30; i >= 0; i--) { // sum += n >>> i & 1; // } // return sum == 1; // 方法二 // while(n % 2 == 0){ // n /= 2; // } // return n == 1; // 方法三: n & (n - 1)会将最后一位1置0, // 如果执行一次后就为0, 则说明最初只有1个"1", 则就是2的幂 return (n & (n - 1)) == 0; }
-
分析
时间复杂度: O(1)
空间复杂度: O(1)
二. 326题: 3的幂
-
题目
给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == x3
-
解题代码
public boolean isPowerOfThree(int n) { if(n < 1){ return false; } while(n % 3 == 0) { n = n / 3; } return n == 1; }
-
分析
时间复杂度: O(1)
空间复杂度: O(1)
三. 342题: 4的幂
-
题目
给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。 -
解题思路
- 因为是4的幂, 所以该数转化为二进制后只有一个"1", 且后面有2n个"0", 如:
4=100, 16=10000, 64=1000000
,
我们可以发现"1"所在的位置恰好都是在偶数位(从0开始算) (num & (num - 1)) == 0
: 说明只有一个"1"0xaaaaaaaa = 1010101010101010
, 其偶数位都为0, 奇数位都为1(num & 0xaaaaaaaa) ==0
则表明"1"在偶数位, 则就是4的幂
- 因为是4的幂, 所以该数转化为二进制后只有一个"1", 且后面有2n个"0", 如:
-
解题代码
public boolean isPowerOfFour(int num) { if(num < 1){ return false; } // 方法一: // while(num % 4 == 0) { // num /= 4; // } // return num == 1; // 方法二: 如果num是4的幂, 则 num & 0xaaaaaaaa == 0 return ((num & (num - 1)) == 0 && (num & 0xaaaaaaaa) ==0); }
-
分析
时间复杂度: O(1)
空间复杂度: O(1)