342. 4的幂

题目链接:

如果 \(n\)\(4\) 的幂,那么 \(n\) 一定也是 \(2\) 的幂。因此我们可以首先判断 \(n\) 是否是 \(2\) 的幂,在此基础上再判断 \(n\) 是否是 \(4\) 的幂。

判断是否是 \(2\) 的幂可参考:2的幂,这里我们采取n & (n - 1) == 0的判断方法。

方法一:二进制中1的位置

思路与算法

如果 \(n\)\(4\) 的幂,那么 \(n\) 的二进制表示中有且仅有一个 \(1\),并且这个 \(1\) 出现在从低位开始的第偶数个二进制位上(这是因为这个 \(1\) 后面必须有偶数个 \(0\))。这里我们规定最低位为第 \(0\) 位,例如 \(n=16\) 时,\(n\) 的二进制表示为 \((10000)_2\) 。唯一的 \(1\) 出现在第 \(4\) 个二进制位上,因此 \(n\)\(4\) 的幂。

由于题目保证了 \(n\) 是一个 \(32\) 位的有符号整数,因此我们可以构造一个整数 \(\rm mask\),它的所有偶数二进制位都是 \(0\),所有奇数二进制位都是 \(1\)。这样一来,我们将 \(n\)\(\rm mask\) 进行按位与运算,如果结果为 \(0\),说明 \(n\) 二进制表示中的 \(1\) 出现在偶数的位置,否则说明其出现在奇数的位置。

根据上面的思路,\(\rm mask\) 的二进制表示为:\((10101010101010101010101010101010)_2\),化为16进制是\(\rm (AAAAAAAA)_{16}\)

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

方法二:取模性质

思路与算法

如果 \(n\)\(4\) 的幂,那么它可以表示成 \(4^x\) 的形式,我们可以发现它除以 \(3\) 的余数一定为 \(1\),即:\(4^x \equiv (3+1)^x \equiv 1^x \equiv 1 (\bmod 3)\)
如果 \(n\)\(2\) 的幂却不是 \(4\) 的幂,那么它可以表示成 \(4^x \times 2\) 的形式,此时它除以 \(3\) 的余数一定为 \(2\)

因此我们可以通过 \(n\) 除以 \(3\) 的余数是否为 \(1\) 来判断 \(n\) 是否是 \(4\) 的幂。

class Solution {
public:
    bool isPowerOfFour(int n) {
        return n > 0 && (n & (n - 1)) == 0 && n % 3 == 1;
    }
};
posted @ 2024-01-15 22:10  胖柚の工作室  阅读(26)  评论(0)    收藏  举报