leetcode
leetcode 2651 ~ 2700
3 的幂

3 的幂

难度:

标签:

题目描述

Given an integer n, return true if it is a power of three. Otherwise, return false.

An integer n is a power of three, if there exists an integer x such that n == 3x.

 

Example 1:

Input: n = 27
Output: true
Explanation: 27 = 33

Example 2:

Input: n = 0
Output: false
Explanation: There is no x where 3x = 0.

Example 3:

Input: n = -1
Output: false
Explanation: There is no x where 3x = (-1).

 

Constraints:

  • -231 <= n <= 231 - 1

 

Follow up: Could you solve it without loops/recursion?

代码结果

运行时间: 40 ms, 内存: 16.1 MB


/*
 * 思路:
 * 我们可以使用Stream和数学方法来解决这个问题。
 * 计算最大的3的幂次方,然后判断给定的n是否能整除该幂次方。
 * 我们使用Math.log来计算log3(n),然后判断其是否为整数。
 */
import java.util.stream.IntStream;

public class Solution {
    public boolean isPowerOfThree(int n) {
        if (n <= 0) return false;
        int maxPowerOfThree = (int) Math.pow(3, (int)(Math.log(Integer.MAX_VALUE) / Math.log(3)));
        return n > 0 && maxPowerOfThree % n == 0;
    }
}

解释

方法:

这个题解的思路是首先检查输入的整数是否为0或者偶数,如果是,则直接返回False,因为0和偶数都不可能是3的幂次方。接着,使用一个循环不断地将n除以3,直到n不能被3整除。最后,如果n变为1,那么说明原始的n是3的幂次方,返回True;否则,返回False。

时间复杂度:

O(log3(n))

空间复杂度:

O(1)

代码细节讲解

🦆
为什么在题解中首先检查输入整数n是否为偶数?3的幂次方与偶数之间有什么关系?
检查n是否为偶数的逻辑在这个题解中是错误的。3的幂次方总是奇数。例如,3^0=1, 3^1=3, 3^2=9, 3^3=27等都是奇数。因此,一个数如果是偶数,它确实不能是3的幂次方,但检查偶数的步骤应该是不需要的,因为3的任何幂次方不会是偶数。
🦆
题解中提到如果n是0或偶数就返回False,但是为什么0特殊情况的处理与偶数可以一起处理?0和偶数是否有本质的区别在这个问题中?
0确实是一个偶数,但在检查是否为3的幂次方的上下文中,0的处理应该与其他偶数分开。0不是3的幂次方,因为3的任何非负整数次幂都至少为1。0在这里应该单独检查并返回False,而不应该与偶数的检查合并。这是因为0是一个边界情况,具有唯一的性质,即它既不是正数也不是负数,不属于任何数的非零次幂。
🦆
在题解中使用了循环来不断地将n除以3直到不能整除,这种方法在n是非常大的负数时会有什么表现?
题解中没有明确指出处理负数的情况,这是一个遗漏。实际上,负数也不能是3的幂次方,因为3的幂次方结果总是正数。如果输入n是负数,那么该方法应该立即返回False,而不是进入循环。如果不这样处理,循环将试图将负数除以3,这将导致n变得更小并继续是负数,从而永远不会等于1,循环将不正确地执行。

相关问题

2 的幂

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false

如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。

 

示例 1:

输入:n = 1
输出:true
解释:20 = 1

示例 2:

输入:n = 16
输出:true
解释:24 = 16

示例 3:

输入:n = 3
输出:false

示例 4:

输入:n = 4
输出:true

示例 5:

输入:n = 5
输出:false

 

提示:

  • -231 <= n <= 231 - 1

 

进阶:你能够不使用循环/递归解决此问题吗?

4的幂

给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false

整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x

 

示例 1:

输入:n = 16
输出:true

示例 2:

输入:n = 5
输出:false

示例 3:

输入:n = 1
输出:true

 

提示:

  • -231 <= n <= 231 - 1

 

进阶:你能不使用循环或者递归来完成本题吗?