326. 3 的幂 ——【Leetcode每日一题】

326. 3 的幂

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

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

示例 1:

输入:n = 27
输出:true

示例 2:

输入:n = 0
输出:false

示例 3:

输入:n = 9
输出:true

示例 4:

输入:n = 45
输出:false

提示:

  • − 2 31 < = n < = 2 31 − 1 -2^{31} <= n <= 2^{31} - 1 231<=n<=2311

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

思路:

法一:数学

一个不能再朴素的做法是将 n 对 3 进行试除

  • 如果n小于等于0, 或者不能被 3 整除,一定不是 3 的幂;

法二(进阶):倍数 & 约数

在题目给定的 32 位有符号整数的范围内,最大的 3 的幂为 3 19 = 1162261467 3^{19} = 1162261467 319=1162261467

  • 我们只需要判断 n 是否是 3 19 3^{19} 319约数 即可。
  • 也要判断是否n小于等于0,只要 n 大于0时才有可能。

代码:(Java、C++)

法一:数学
Java

public class IsPowerOfThree {
    
    

	public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub
		int n = 27;
		System.out.println(isPowerOfThree(n));
	}
	
	public static boolean isPowerOfThree(int n) {
    
    
		while(n != 1) {
    
    
			if(n % 3 != 0 || n <= 0) {
    
    
				return false;
			}
			n /= 3;
		}
		return true;
    }
}

C++

class Solution {
    
    
public:
    bool isPowerOfThree(int n) {
    
    
		while(n != 1) {
    
    
			if(n % 3 != 0 || n <= 0) {
    
    
				return false;
			}
			n /= 3;
		}
		return true;
    }
};

法二(进阶):倍数 & 约数
Java

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

C++

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

运行结果:

在这里插入图片描述

复杂度分析:

  • 时间复杂度:法一: O ( log ⁡ 3 n ) O\left(\log _{3} n\right) O(log3n);法二: O ( 1 ) O(1) O(1)
  • 空间复杂度 O ( 1 ) O(1) O(1)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!

注: 如有不足,欢迎指正!

猜你喜欢

转载自blog.csdn.net/weixin_43412762/article/details/129926629