leetcode 326. Power of Three
Given an integer, write a function to determine if it is a power of three.
Follow up:
Could you do it without using any loop / recursion?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class Solution( object ): def isPowerOfThree( self , n): """ :type n: int :rtype: bool """ """ 0 == false 1 == true 2 == false 3 == true 9 == true """ if n < = 0 : return False if n = = 1 : return True else : return self .isPowerOfThree(n / 3 ) if n % 3 = = 0 else False |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class Solution( object ): def isPowerOfThree( self , n): """ :type n: int :rtype: bool """ """ 0 == false 1 == true 2 == false 3 == true 9 == true """ if n < = 0 : return False while n: if n = = 1 : return True if n % 3 ! = 0 : return False n / = 3 return False |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class Solution( object ): def isPowerOfThree( self , n): """ :type n: int :rtype: bool """ """ 0 == false 1 == true 2 == false 3 == true 9 == true """ if n < = 0 : return False while (n % 3 = = 0 ): n / = 3 return n = = 1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Solution( object ): def isPowerOfThree( self , n): """ :type n: int :rtype: bool """ """ 0 == false 1 == true 2 == false 3 == true 9 == true """ return n in { 1 , 3 , 9 , 27 , 81 , 243 , 729 , 2187 , 6561 , 19683 , 59049 , 177147 , 531441 , 1594323 , 4782969 , 14348907 , 43046721 , 129140163 , 387420489 , 1162261467 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Solution( object ): def isPowerOfThree( self , n): """ :type n: int :rtype: bool """ """ 0 == false 1 == true 2 == false 3 == true 9 == true """ Max3PowerInt = 1162261467 # 3^19, 3^20 = 3486784401 > MaxInt32 MaxInt32 = 2147483647 # // 2^31 - 1 if (n < = 0 or n > Max3PowerInt): return False return Max3PowerInt % n = = 0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Solution( object ): def isPowerOfThree( self , n): """ :type n: int :rtype: bool """ """ 0 == false 1 == true 2 == false 3 == true 9 == true """ if n < = 0 : return False k = math.log(n, 3 ) return abs (k - round (k)) < 1e - 10 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Solution( object ): def isPowerOfThree( self , n): """ :type n: int :rtype: bool """ """ 0 == false 1 == true 2 == false 3 == true 9 == true """ Max3PowerInt = 1162261467 # 3^19, 3^20 = 3486784401 > MaxInt32 MaxInt32 = 2147483647 # // 2^31 - 1 if (n < = 0 or n > Max3PowerInt): return False return Max3PowerInt % n = = 0 |
其他:
Method 1
Find the maximum integer that is a power of 3 and check if it is a multiple of the given input. (related post)
public boolean isPowerOfThree(int n) {
int maxPowerOfThree = (int)Math.pow(3, (int)(Math.log(0x7fffffff) / Math.log(3)));
return n>0 && maxPowerOfThree%n==0;
}
Or simply hard code it since we know maxPowerOfThree = 1162261467
:
public boolean isPowerOfThree(int n) {
return n > 0 && (1162261467 % n == 0);
}
It is worthwhile to mention that Method 1 works only when the base is prime. For example, we cannot use this algorithm to check if a number is a power of 4 or 6 or any other composite number.
Method 2
If log10(n) / log10(3)
returns an int (more precisely, a double but has 0 after decimal point), then n is a power of 3. (original post). But be careful here, you cannot use log
(natural log) here, because it will generate round off error for n=243
. This is more like a coincidence. I mean when n=243
, we have the following results:
log(243) = 5.493061443340548 log(3) = 1.0986122886681098
==> log(243)/log(3) = 4.999999999999999
log10(243) = 2.385606273598312 log10(3) = 0.47712125471966244
==> log10(243)/log10(3) = 5.0
This happens because log(3)
is actually slightly larger than its true value due to round off, which makes the ratio smaller.
public boolean isPowerOfThree(int n) {
return (Math.log10(n) / Math.log10(3)) % 1 == 0;
}
Method 3 related post
public boolean isPowerOfThree(int n) {
return n==0 ? false : n==Math.pow(3, Math.round(Math.log(n) / Math.log(3)));
}
Method 4 related post
public boolean isPowerOfThree(int n) {
return n>0 && Math.abs(Math.log10(n)/Math.log10(3)-Math.ceil(Math.log10(n)/Math.log10(3))) < Double.MIN_VALUE;
}
Cheating
Method
This is not really a good idea in general. But for such kind of power
questions, if we need to check many times, it might be a good idea to store the desired powers into an array first. (related post)
public boolean isPowerOfThree(int n) {
int[] allPowerOfThree = new int[]{1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049, 177147, 531441, 1594323, 4782969, 14348907, 43046721, 129140163, 387420489, 1162261467};
return Arrays.binarySearch(allPowerOfThree, n) >= 0;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」