首页 > 技术文章 > [leetcode]231. Power of Two,判断数字是否为2的n次方

ls-shiyi 2019-02-23 22:13 原文

一、题目描述

判断一个数字是否为2的n次方。例子如下:

Example 1:

Input: 1
Output: true 
Explanation: 2的0次方 = 1

Example 2:

Input: 16
Output: true
Explanation: 2的4次方 = 16

Example 3:

Input: 218
Output: false

二、解题思路

         这道题在leetcode中属于easy,也是有着40%以上的ac率,因此是非常简单的一种,我的解题思路如下,既然判断一个数是否为2的次方数,那么就理所应当的可以借助二进制的做法,一个2的整次方的数字的二进制表示形式是这样的,100000..,即第一位为1,剩下的位数全部为0,这样我们就可以将这个二进制数字不断的右移,直至它等于一,同时算出右移了n位,再生成一个左移n位的数字对比即可,如果相同则表示是一个2的n次方数字,如果不同则不是。代码如下:

public boolean isPowerOfTwo(int n) {
        if (n<=0){
            return false;
        }
        int m =0;
        int tmp = n;
        while (tmp!=1){
            tmp=tmp>>1;
            m++;
        }
        if (Math.pow(2,m)==n){
            return true;
        }
        return false;
    }

   更巧妙的解法——一行代码完事

public boolean isPowerOfTwo(int n) {
    return ((n & (n-1))==0 && n>0);
}

         这个是看到别人写的一行代码,确实当时就震惊了,为什么自己已经想到了这个问题与二进制有关,为什么没有再到想利用二进制去解决呢?

         这个人就是直接利用2的次方数字,二进制表示形式,首位为1,剩余均为0的特点,直接让n-1,则得到的是与n“互补”的形式,第一位为0,剩余位为1的二进制表现形式,如果二者进行与操作,把1全部消除得到0的话, 标明这个数字即为2的次方数字。很巧妙。

推荐阅读