zoukankan      html  css  js  c++  java
  • 【LeetCode & 剑指offer刷题】发散思维题6:231. Power of Two(系列)

    【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)

    231. Power of Two

    Given an integer, write a function to determine if it is a power of two.
    Example 1:
    Input: 1
    Output: true
    Example 2:
    Input: 16
    Output: true
    Example 3:
    Input: 218
    Output: false
     
    //判断一个整数是否为2的幂(说明必为正数)
    class Solution
    {
    public:
        bool isPowerOfTwo(int n)
        {
            if(n<=0) return false; //特殊情况判断
          //  cout << ((n-1)&n) << endl;
            if( ((n-1)&n) == 0 )
            {
                return true;//若为2的幂,则二进制表示中只有一个1,减一做与运算之后就会变为0
            }
            else return false;
            //直接换成 return ((n-1)&n) == 0;可以使代码更紧凑
        }
    };
     
    326. Power of Three
    Given an integer, write a function to determine if it is a power of three.
    Example 1:
    Input: 27
    Output: true
    Example 2:
    Input: 0
    Output: false
    Example 3:
    Input: 9
    Output: true
    Example 4:
    Input: 45
    Output: false
    Follow up:
    Could you do it without using any loop / recursion?
    //循环法
    /*
    class Solution
    {
    public:
        bool isPowerOfThree(int n)
        {
            if(n<1) return false;
            while(n%3 == 0) n /= 3; //多次除以3
           
            return n == 1; //如果最后商为1,则说明为3的幂
        }
    };*/
    /*取对数法
    n=3^i i=log3(n)
    i=logb(n)/logb(3) 看i是否为整数(除以1看是否余数为0)
    ,这里选择10为底(没有问题,不过不明白为什么不存在舍入误差),若选择自然对数,则需考虑舍入误差
    */
    #include <cmath>
    class Solution
    {
    public:
        bool isPowerOfThree(int n)
        {
            return fmod(log10(n)/log10(3), 1) == 0; //fmod为计算除法运算 x/y 的浮点余数
        }
    };
     
    java:return (Math.log(n) / Math.log(3) + epsilon) % 1 <= 2 * epsilon;
     
    342. Power of Four
    Given an integer (signed 32 bits), write a function to check whether it is a power of 4.
    Example:
    Given num = 16, return true. Given num = 5, return false.
    Follow up: Could you solve it without loops/recursion?
    Credits:
    Special thanks to @yukuairoy for adding this problem and creating all test cases.
    /*
    先判断是否为2的幂,再判断是否满足(num-1)为3的倍数(必要条件,不过不知道两个组合起来可不可以称为充分条件)
    We know from Binomial Theroem that (1+X)^n = C(n,0) + C(n,1)*X + C(n,2)*X^2 + C(n,3)*X^3 +.........+ C(n,n)*X^n
    Put X=3, we get 4^n = 1 + C(n,1)*3 + C(n,2)*3^2 + C(n,3)*3^3 +.........+ C(n,n)*3^n
    by moving 1 left side, we get 4^n - 1 = C(n,1)*3 + C(n,2)*3^2 + C(n,3)*3^3 +.........+ C(n,n)*3^n
    i.e (4^n - 1) = 3 * [ C(n,1) + C(n,2)*3 + C(n,3)*3^2 +.........+ C(n,n)*3^(n-1) ]
    This implies that (4^n - 1) is multiple of 3.
    */
    class Solution
    {
    public:
        bool isPowerOfFour(int num)
        {
            if(num<=0) return false;
            return ((num-1)&num) == 0 && (num-1)%3 == 0;
        }
    };
     
     
     
     
  • 相关阅读:
    新手学习FFmpeg
    新手学习FFmpeg
    新手学习FFmpeg
    进阶计划
    面试题汇总
    grep命令
    Quartz教程三:Job与JobDetail介绍
    spring boot热部署
    Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(四)
    SpringBoot集成篇(二) 异步调用Async
  • 原文地址:https://www.cnblogs.com/wikiwen/p/10229513.html
Copyright © 2011-2022 走看看