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