[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中,只能说同九义,汝何秀。。。

posted @ 2018-10-08 20:55  Lin.B  阅读(121)  评论(0编辑  收藏  举报