BM342PowerOfFour

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 <= 0) return false;
        if (num & num - 1) return false;
        return num % 3 == 1;
    }
};

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-1))==0 && num>0 && (num-1)%3==0;
}

解法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, 4).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) == 1) && ((Integer.numberOfTrailingZeros(num) % 2) == 0);
    }
}

The time is also O( log n), because bitCount and numberOfTrailingZeros both cost O( log n).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章