Silu
- 1 Use Bit Manipulation
- 1.1 自己想的 Failed case again!!: n = 0;
- 1.2 Bit的另一種判定方法也不錯: 主要思想是確認是power of two之後, 再確認是不是power of 4. 附在後面解法1.2
- 1.3 Another way: 判斷是power of two以後,EVEN number of trailing zeros 來源https://discuss.leetcode.com/topic/42961/two-1-line-java-solutions
- 1.4 來源同上,還可以將之變為四進制數再判斷
- Use Math, cannot use the power of two one
解法1.2
https://discuss.leetcode.com/topic/43879/my-non-loop-solution-with-no-relation-to-the-bit-length-of-int
class Solution {
public:
bool isPowerOfFour(int num) {
if (num <= ) return false;
if (num & num - ) return false;
return num % == ;
}
};
I observed that 2 * k % 3 = 1 if and only if k is even, that is, 2 * k is a power of 4.
So we can just check whether these three conditions are all true:
num must be positive
num must be power of 2
num mod 3 must be 1
public boolean isPowerOfFour(int num) {
return (num&(num-))== && num> && (num-)%==;
}
解法1.3 1.4
https://discuss.leetcode.com/topic/42961/two-1-line-java-solutions
Solution 1: convert it into radix 4 number, and check if it is in format “1”, “10”, “100”, “1000” … etc.
public class Solution {
public boolean isPowerOfFour(int num) {
return Integer.toString(num, ).matches("10*");
}
}
Time is O( log n) due to toString and matches both cost O( log n).
Solution 2: check if its binary has only ONE “1” bit and EVEN number of trailing zeros. Theory is similar to above, but no need of conversion into binary.
public class Solution {
public boolean isPowerOfFour(int num) {
return (Integer.bitCount(num) == ) && ((Integer.numberOfTrailingZeros(num) % ) == );
}
}
The time is also O( log n), because bitCount and numberOfTrailingZeros both cost O( log n).