【LeetCode】326. 3 的幂

文章介绍了两种判断一个数是否为3的幂次方的方法:试除法和利用3的int范围内最大幂次。试除法通过不断除以3直到无法整除,检查结果是否为1;倍数与约数方法则通过判断输入数是否为1162261467(3的int最大幂)的约数。需要注意负数和n的类型限制。
摘要由CSDN通过智能技术生成

326. 3 的幂(简单)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方法一:试除法

思路

  • 我们可以先进行特殊点判断,n <= 0 的数都不可能是 3 的幂次方。
  • 接着,当 n > 0 n 能被 3 整除 时,我们对其整除 3 ,直到该条件不满足,我们就判断此时的 n, 如果 n == 1 ,即 30 ,说明原本的 n 是 3的幂次方。

代码

class Solution {
public:
    bool isPowerOfThree(int n) {
        if(n < 0) return false;
        while(n > 0 && n%3 == 0){
            // 能被3整除
            n /= 3;
        }
        return n == 1;
    }
};

方法二:倍数 & 约数

题目要求不能使用循环递归,而传参 n 的数据类型为 int,这引导我们首先分析出 int 范围内的最大 3 次幂是多少,约为 319=11622614673 。

如果 n 为 3 的幂的话,那么必然满足 n∗3k=1162261467,即 n 与 1162261467 存在倍数关系

因此,我们只需要判断 n 是否为 1162261467 的约数即可。

class Solution {
public:
    bool isPowerOfThree(int n) {
        return n > 0 && 1162261467 % n == 0;
    }
};

收获

  • 这道题理解起来很简单,但是一开始我陷入了一个误区,以为 -27 之类的数也是 3 的幂次方,导致算不出来。

  • 此外,投机取巧的方法二也需要掌握。

参考资料

宫水三叶:一题三解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值