lc面试准备:Power of Two

1 题目

Given an integer, write a function to determine if it is a power of two.

接口 boolean isPowerOfTwo(int n)

2 思路

判断一个整数是否是2的幂次结果数。

0100 ==> 4 ; 1000 ==>8 ; 10000 ==> 16
0011 ==> 3 ; 0111 ==>7 ; 01111 ==> 15

思路1:2的次方数都只有一个1,剩下的都是0。我们只要每次判断最低位是否为1,然后向右移位,最后统计1的个数即可判断是否是2的次方数
复杂度:Time O(32); Space O(1)

思路2:如果一个数是2的次方数的话,那么它的二进数必然是最高位为1,其它都为0,那么如果此时我们减1的话,则最高位会降一位,其余为0的位现在都为变为1,那么我们把两数相与,就会得到0。
复杂度:Time O(1); Space O(1)

3 代码

  • 思路1
        public boolean isPowerOfTwo(int n) {
		int count1 = 0;
		for (; n > 0;) {
			int tmp = n & 1;
			count1 += tmp;
			n = n >> 1;
		}
		boolean is = (count1 == 1);
		return is;
	}
  • 思路2
        public boolean isPowerOfTwo(int n) {
		boolean is = false;
		if (n > 0) {
			is = ((n - 1) & n) == 0;
		}
		return is;
	}

4 总结

这是位操作的智力题。

5 参考

posted on 2015-07-06 22:51  BYRHuangQiang  阅读(260)  评论(0编辑  收藏  举报

导航