3的幂[递归/循环 || 公约数]

前言

3的幂,可不断除3来判定一个数是否为3的幂,有两种方式,一种递归判定,没有循环结构,代码简单&速度稍快,就是需要函数栈的内存开销;而递归的方式稍慢,但是代码容易理解 & 没有函数栈的内存开销。除此之外,能数学化,是解题的最高境界(当可以数学化时),而通过拿到3的最大幂来对n进行取余,就可以知道该数是否为3的幂。

一、3的幂

在这里插入图片描述

二、直接法 & 数学法

1、递归与循环

// 3的幂
public class IsPowerOfThree {
    /*
    1-可不断的对3取商,来判定是否是3的幂,即n = 3 ^x^;
     */
    // 递归版 :测试结果,递归还是比循环稍快。
    public boolean isPowerOfThree(int n) {
        if (n == 1) return true;

        if (n <= 0 || n % 3 != 0) return false;
        if (n / 3 == 1) return true;

        return isPowerOfThree(n / 3);
    }

    // 循环版
    public boolean isPowerOfThree2(int n) {
        if (n <= 0) return false;

        while (n > 0) {
            if (n == 1) return true;
            if (n % 3 != 0) return false;

            n /= 3;
        }
        return false;
    }
}

2、3的最大幂与约数

// 进阶:不使用递归/循环完成。
class IsPowerOfThree2 {
    /*
    不使用循环/递归,就必须挖掘到和3/幂相关的特性,用数学/位运算一步到位那种。
    core:找到3的最大幂数,如果n是其公约数,那么n一定是3的幂。
     */
    public boolean isPowerOfThree(int n) {
        int max_int_power_3 = 1162261467;

        return n > 0 && max_int_power_3 % n == 0;
    }
}

总结

1)3的幂,锻炼典型的递归 & 循环。

2)将问题数学化,大大降低时间复杂度,了解幂数和约数。

参考文献

[1] LeetCode 3的幂

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值