[LeetCode] Power of Two 判断2的次方数

简介:

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

Hint:

  1. Could you solve it in O(1) time and using O(1) space?

 

这道题让我们判断一个数是否为2的次方数,而且要求时间和空间复杂度都为常数,那么对于这种玩数字的题,我们应该首先考虑位操作 Bit Operation。在LeetCode中,位操作的题有很多,比如比如Repeated DNA Sequences 求重复的DNA序列 Single Number 单独的数字,   Single Number II 单独的数字之二 , Grey Code 格雷码 Reverse Bits 翻转位Bitwise AND of Numbers Range 数字范围位相与Number of 1 Bits 位1的个数和 Divide Two Integers 两数相除等等。那么我们来观察下2的次方数的二进制写法的特点:

1     2       4         8         16   ....

1    10    100    1000    10000 ....

那么我们很容易看出来2的次方数都只有一个1,剩下的都是0,所以我们的解题思路就有了,我们只要每次判断最低位是否为1,然后向右移位,最后统计1的个数即可判断是否是2的次方数,代码如下:

解法一:

class Solution {
public:
    bool isPowerOfTwo(int n) {
        int cnt = 0;
        while (n > 0) {
            cnt += (n & 1);
            n >>= 1;
        }
        return cnt == 1;
    } 
};

这道题还有一个技巧,如果一个数是2的次方数的话,根据上面分析,那么它的二进数必然是最高位为1,其它都为0,那么如果此时我们减1的话,则最高位会降一位,其余为0的位现在都为变为1,那么我们把两数相与,就会得到0,用这个性质也能来解题,而且只需一行代码就可以搞定,如下所示:

解法二:

class Solution {
public:
    bool isPowerOfTwo(int n) {
        return (n > 0) && (!(n & (n - 1)));
    } 
};

本文转自博客园Grandyang的博客,原文链接:判断2的次方数[LeetCode] Power of Two,如需转载请自行联系原博主。

相关文章
LeetCode 342. Power of Four
给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。
56 0
LeetCode 342. Power of Four
|
JavaScript
代码随线录刷题|LeetCode 392.判断子序列 115.不同的子序列
代码随线录刷题|LeetCode 392.判断子序列 115.不同的子序列
代码随线录刷题|LeetCode 392.判断子序列 115.不同的子序列
LeetCode每日一题——1704. 判断字符串的两半是否相似
给你一个偶数长度的字符串 s 。将其拆分成长度相同的两半,前一半为 a ,后一半为 b 。
74 0
|
Java
java学习第四天笔记-流程控制语句-分支结构82-判断和循环次数-回文数leetcode求商和余数
java学习第四天笔记-流程控制语句-分支结构82-判断和循环次数-回文数leetcode求商和余数
58 0
java学习第四天笔记-流程控制语句-分支结构82-判断和循环次数-回文数leetcode求商和余数
|
Java
java学习第四天笔记-流程控制语句-分支结构81-判断和循环次数-回文数leetcode
java学习第四天笔记-流程控制语句-分支结构81-判断和循环次数-回文数leetcode
54 0
java学习第四天笔记-流程控制语句-分支结构81-判断和循环次数-回文数leetcode
|
存储
|
数据库
LeetCode(数据库)- 判断三角形
LeetCode(数据库)- 判断三角形
85 0
|
算法 索引 Python
Leetcode刷题指南之Python求两数之和【多种思路详解】,判断是否为回文数【将整数转为字符串】【不转为字符串】
两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。
361 1
Leetcode刷题指南之Python求两数之和【多种思路详解】,判断是否为回文数【将整数转为字符串】【不转为字符串】

热门文章

最新文章