[leetcode] Poser of Three

Posted Lin.B

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[leetcode] Poser of Three相关的知识,希望对你有一定的参考价值。

Given an integer, write a function to determine if it is a power of three.

Example 1:

Input: 27
Output: true

Example 2:

Input: 0
Output: false

Example 3:

Input: 9
Output: true

Example 4:

Input: 45
Output: false

Follow up:
Could you do it without using any loop / recursion?


分析:题目翻译一下:要求判断一个正整数n是否是3的次幂。

判断方法有很多,我们根据算法思想罗列一下。

1、递归

因为如果这个数字n是3的次幂,那么n/3一定也是3的次幂。因此只要不停/3递归就能判断出来了。

代码如下:

 1 class Solution {
 2     public boolean isPowerOfThree(int n) {
 3         return helper(n);
 4     }
 5     private boolean helper(int n) {
 6         if ( n == 0 ) return false;
 7         else if ( n == 1 ) return true;
 8         if ( n % 3 == 0 ) return helper(n/3);
 9         return false;
10     }
11 }

    这里要注意第8行,在进行除以3操作之前,要判断这个数字是否对3取余为0。比如45,45/3=15,15/3=5,5/3=1,如果不判断,就会认为是true,其实在5的时候我们就发现他已经是false了。因此在递归过程中需要加上这个判断。

2、循环

循环思路很好理解,具体的思想和递归一样,只是不同的形式。

代码如下:

 1 class Solution {
 2     public boolean isPowerOfThree(int n) {
 3         while ( n > 0 ){
 4             if ( n == 1 ) return true;
 5             if ( n % 3 == 0 ){
 6                 n = n / 3;
 7             }else {
 8                 return false;
 9             }
10         }
11         return false;
12     }
13 }

3、数学方法

因为要判断是否是3的次幂,那么对这个数取log以三为底的对数,得到的值一定是整数。

关键点有两个:如何将n取log3为底的对数;如何判断是整数

1 class Solution {
2     public boolean isPowerOfThree(int n) {
3         return Math.log10(n)/Math.log10(3) % 1 == 0;
4     }
5 }

判断是否是整数,对1取余 是否 为0就可以了。

 

其他的还有一些方法,有的太数学,有的太秀。。比如在int范围内,用3的最高次次幂(1162261467 % n) == 0,太数学,没有推广性。还有的将所有的可能取值保存在一个set中,只能说同九义,汝何秀。。。


以上是关于[leetcode] Poser of Three的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode][JavaScript]Power of Three

leetcode 326. Power of Three

[leetcode]326. Power of Three

LeetCode Maximum Product of Three Numbers

LeetCode----326. Power of Three(Java)

LeetCode - 326. Power of Three