Leetcode刷题日记(十七)

老台词虽迟但到:欢迎大家来到一晚一度的leetcode刷题时间。今天我们继续讲一下我们的老朋友--递归(最后一期啦)。递归的重要性我就不多说啦,今天我们就用它来判断某个数是否为某个数的幂次方。下面上题目:

有一种较为取巧的做法。在题目给定的 3232 位有符号整数的范围内,最大的 22 的幂为 2^{30} = 1073741824.我们只需要判断 nn 是否是 2^{30}的约数即可。

解题代码:

class Solution {
private:
    static constexpr int BIG = 1 << 30;

public:
    bool isPowerOfTwo(int n) {
        return n > 0 && BIG % n == 0;
    }
};

重点方法;二进制方法:

一个数 nn 是 22 的幂,当且仅当 nn 是正整数,并且 nn 的二进制表示中仅包含 11 个 11。因此我们可以考虑使用位运算,将 nn 的二进制表示中最低位的那个 11 提取出来,再判断剩余的数值是否为 00 即可。下面介绍常见的与「二进制表示中最低位」相关的位运算技巧。

技巧是n & (n - 1).(原理这里博主就不多说了,较复杂,博主也不好讲《有兴趣网上查)

其中& 表示按位与运算。该位运算技巧可以直接将 nn 二进制表示的最低位 11 移除.因此,如果 n 是正整数并且 n& (n - 1) = 0,那么 n 就是 2 的幂。

解题代码:

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

好啦,今天就分享到这啦,大家早点睡,少熬夜

本贴为博主亲手整理。如有错误,请评论区指出,一起进步。谢谢大家的浏览.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值