[231] Power of Two

原创 2016年06月25日 19:50:38

1. 题目描述

Given an integer, write a function to determine if it is a power of two.
求一个整数是不是2的n次方

2. 解题思路

首先想到的是log2(2^n) = n,那么只要求该整数的对数是否是一个整数即可确定该整数k是否为2^n,但是java给定的Math函数中只有以e为底k的对数,没有直接求以m为底k的对数的函数,所以使用了换底公式转换logm(k) = log(k)/log(m),如Code1,但因为log2并不是一个整数,所以在做除法的时候会出现一定的精度损失,这种方法就无法实施了。于是我们使用第二种方法,2的n次方也就是n个2相乘,也就代表k除以2取余等于0,且除到最后得到的结果为1。比如举一个不满足要求的结果12/2=6余0,6/2=3余0,3/2=1余1。
做了后面的题发现使用log10代替log可以规避这个精度问题,具体原因未明。
另外得知了一种新的方法,因为他是一个整型,且很容易的可以被看做一个二进制数,当一个数是2的n次方时,使用二进制表示为m=16=10000(n=4),那么m-1=15=01111,那么这两个数按位与等于0,而其他的数字则没有这个特性,如m=18=10010 m-1=17=10001,按位与为10000。需注意2的0次方算不算。

3. Code

// Code1(Failed)
public class Solution {
    //当n = 536870912时,精度出现问题
    public boolean isPowerOfTwo(int n) {
        double result = Math.log(n) / Math.log(2);
        int i = (int)result;
        return (result - i) == 0; // 判断result是不是整数
    }
}
// Code2(Accept)
public class Solution {
    public boolean isPowerOfTwo(int n) {
        if (n == 0)
            return false;
        // n取余2为0
        while(n%2 == 0)
        {
            n = n/2;
        }
        if (n == 1)
            return true;
        return false;
    }
}
// Code3
public class Solution {
    public boolean isPowerOfTwo(int n) {
        // 如果n=0返回false,else返回n按位与n-1
        // 10000 & 01111 = 0
        return n == 0 ? false : n & (n-1) == 0;
    }
}
版权声明:本文为博主原创文章,转载请注明出处。http://blog.csdn.net/camlot_

LeetCode 231: Power of Two

Given an integer, write a function to determine if it is a power of two. 判断一个数是否是2的幂,判断方法主要依据2的...
  • sunao2002002
  • sunao2002002
  • 2015年07月06日 18:34
  • 3843

leetcode 231: Power of Two

leetcode 231: Power of Two python, java, c++
  • xudli
  • xudli
  • 2015年07月07日 05:01
  • 10499

Leetcode 231 - Power of Two

题意判断一个数n是否是2的幂次。思路算法1时间复杂度O(logn)O(logn)。直接检查n能否一直除以2直到1。算法2时间复杂度O(1)O(1)非常trick的一个思路,我们知道n如果是2的幂次,那...
  • Lzedo
  • Lzedo
  • 2017年03月02日 21:03
  • 94

leetcode 231:Power of Two

题目: Given an integer, write a function to determine if it is a power of two. 分析: 本题需要判断一个数是否为2的n...
  • tuobadon
  • tuobadon
  • 2015年07月06日 17:07
  • 106

leetCode #231 Power of Two

题目:判断一个整数是否是2的次方 分析:2的次方具有这样的特征:二进制表示下,有且只有第一位是1,其余位为0。所以n&n-1必定为0 答案: class Solution { public: ...
  • MarStarck
  • MarStarck
  • 2015年08月10日 22:28
  • 110

LeetCode[231] Power of Two

Given an integer, write a function to determine if it is a power of two. 2的幂二进制表示中只有一个1,所以一定满足 n ...
  • wrsophia_977
  • wrsophia_977
  • 2016年09月24日 15:50
  • 77

231:Power of Two

题目链接:https://leetcode.com/problems/power-of-two/ 方法:二进制 思路:一开始做就是不断除以2找奇数,这样做ac了,但是比较麻烦,网上看到一种二进制的...
  • freedom098
  • freedom098
  • 2015年09月26日 19:39
  • 140

LeetCode(231)-- Power of Two

漫漫算法之路,坚持不懈。
  • PansTIME
  • PansTIME
  • 2015年08月08日 09:20
  • 157

[leetcode 231]Power of Two

class Solution { public: bool isPowerOfTwo(int n) { /* if(n
  • Xiaohei00000
  • Xiaohei00000
  • 2015年11月01日 17:57
  • 190

LeetCode 231 Power of Two

Given an integer, write a function to determine if it is a power of two. AC代码如下: class Solution { ...
  • gange1992
  • gange1992
  • 2017年03月31日 18:26
  • 65
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[231] Power of Two
举报原因:
原因补充:

(最多只允许输入30个字)