LeetCode 第 231 号问题:2 的幂

本文首发于公众号「五分钟学算法」,是图解 LeetCode 系列文章之一。c++

我的网站:www.cxyxiaowu.comgit

题目来源于 LeetCode 上第 231 号问题:2 的幂。题目难度为 Easy,目前经过率为 45.6% 。github

题目描述

给定一个整数,编写一个函数来判断它是不是 2 的幂次方。算法

示例 1:bash

输入: 1
输出: true
解释: 2^0 = 1
复制代码

示例 2:函数

输入: 16
输出: true
解释: 2^4 = 16
复制代码

示例 3:网站

输入: 218
输出: false
复制代码

题目解析

首先,先来分析一下 2 的次方数的二进制写法:spa

表格

仔细观察,能够看出 2 的次方数都只有一个 1 ,剩下的都是 0 。根据这个特色,只须要每次判断最低位是否为 1 ,而后向右移位,最后统计 1 的个数便可判断是不是 2 的次方数。code

代码很简单:cdn

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。

好比 2 的 3 次方为 8,二进制位 1000 ,那么 8 - 1 = 7,其中 7 的二进制位 0111。

图片描述

代码实现

利用这个性质,只需一行代码就能够搞定。

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

相关文章
相关标签/搜索