zoukankan      html  css  js  c++  java
  • 142 O(1)时间检测2的幂次

    原题网址:https://www.lintcode.com/problem/o1-check-power-of-2/description

    描述

    用 O(1) 时间检测整数 n 是否是 2 的幂次。

    您在真实的面试中是否遇到过这个题?  

    样例

    n=4,返回 true;

    n=5,返回 false.

    挑战

    O(1) time

    标签
    比特位操作
     
    思路:排除法,负数和0肯定不是,奇数除了1都不是,偶数的话含有3、 5、 7这三个因子的都不是,剩下的就是了。第一次提交代码时没考虑1的情况,脑子驴了,还以为0次幂是0……
    虽然AC了,但直觉题目应该不是考察这个,果然一看标签,位操作……不看标签就get不到考点,吐血
     
    还是把排除法AC代码放上来:
    class Solution {
    public:
        /**
         * @param n: An integer
         * @return: True or false
         */
        bool checkPowerOf2(int n) {
            // write your code here
            if (n<=0)
         {
             return false;
         }
         if (n%2!=0&&n!=1)//把1给忘了……;
         {
             return false;
         }
         else if (n%3==0||n%5==0||n%7==0)
         {
             return false;
         }
         
         return true;
        }
    };

     使用位操作的话,不难发现,2的次幂的二进制表达有个特点,即只有一位是1,如

    2^0  1

    2^1  10

    2^2   100

    2^3   1000

    ……

    所以如果一个整数的二进制只有一个数位是1它就是2的次幂,那怎么判断整数的二进制只有一个数位是1呢?

    可以发现,若整数n是2的次幂,则n减1再与n &运算后值为0。可参考此文章 ,说的很透彻。

    代码:

    bool checkPowerOf2(int n)
    {
        if (n<1)
        {
            return false;
        }
        return (n&(n-1))==0; //注意加括号,== 优先级大于&;
    }

    参考:C++ 运算符的优先级和结合性

    另一种解法:https://blog.csdn.net/orekinana/article/details/60756718

     

     
  • 相关阅读:
    时间复杂度和空间复杂度
    七、vue计算属性
    六、vue侦听属性
    四、vue派发更新
    五、vue nextTick
    三、vue依赖收集
    二、vue响应式对象
    递归
    链表
    TypeScript类型定义文件(*.d.ts)生成工具
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/9152840.html
Copyright © 2011-2022 走看看