本篇博客会讲解力扣“326. 3 的幂”的解题思路,这是题目链接。
昨天刚刚讲解完2的幂,今天就来看看3的幂。
思路1
3的幂不能像2的幂那样,直接看二进制中是否有且仅有一位为1,所以“2的幂”那道题中的前两种方法就失效了,但是方法3仍然能用,即判断该数是否是一个很大的3的幂次方的约数。代码如下:
bool isPowerOfThree(int n){
// n是否为很大的3的幂次方的约数
// 3^19=1162261467
return n > 0 && 1162261467 % n == 0;
}
思路2
不过大家可能忽略了最简单的思路。我们可以不断地除以3,直到不能整除为止。如果最后n的结果是1,就说明一开始的n是3的幂。
bool isPowerOfThree(int n){
if (n <= 0)
{
return false;
}
// 反复除以3,直到不能整除为止
while (n % 3 == 0)
{
n /= 3;
}
return n == 1;
}
总结
判断一个正整数n是不是另外一个正整数k的幂次方,可以从以下几个方面来考虑:
- 特殊思路,如“2的幂”可以转换为判断二进制中是否有且仅有一位为1,从而转换为使用特殊的位运算技巧,如n & n - 1或n & -n。
- 直观思路,让n反复除以k,直到不能整除为止。若最后的结果是1,就说明一开始的n是k的幂次方。
- 通用思路,直接判断n是不是一个很大的k的幂次方的约数。
感谢大家的阅读!