leetcode[Power of Three]

xiaoxiao2021-02-28  89

解法一(用到了循环,不符合题目要求):

public class Solution { public boolean isPowerOfThree(int n) { for(int i = 0; ;i++){ if(Math.pow(3, i) == n){ return true; } if(Math.pow(3, i) > n){ return false; } } } }

解法二:

public class Solution { public boolean isPowerOfThree(int n) { //因为在int范围内,所以可以找出所有3的幂 HashSet<Integer> set = new HashSet<>(Arrays.asList(1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049, 177147, 531441, 1594323, 4782969, 14348907, 43046721, 129140163, 387420489, 1162261467)); return set.contains(n); } } 解法三:

public class Solution { public boolean isPowerOfThree(int n) { //判断一个数是否是3的幂,那么就可以通过计算log3(n)是否为整数来判断 //由于没有直接的log3(n)这个函数,所以通过换底公式 if(n <= 0) return false;//特殊情况单独处理 if(Math.abs(Math.log(n) / Math.log(3) - Math.ceil(Math.log(n) / Math.log(3))) > 0.00000000000001){//取对数有一个误差,要考虑在内 return false; } else{ return true; } } } 最优解:

public class Solution { public boolean isPowerOfThree(int n) { //如果一个数是3的幂,那么这个数的因子也是3的幂,3^(a+b)=3^a * 3^b //所以在int范围内用最大的3^19来对n求余,如果n是3的幂,那么余数就是0 //如果一个数的因子不是3的幂,那么这个数就不是3的幂 //所以余数也就不为0 // 1162261467 is 3^19, 3^20 is bigger than int //return (n >= 0 && 1162261467 % n == 0); 不对,若n为0,后面会有除0的情况发生 return (n > 0 && 1162261467 % n == 0); } }

转载请注明原文地址: https://www.6miu.com/read-46774.html

最新回复(0)