326. Power of Three
原题链接:https://leetcode.com/problems/power-of-three/description/
实现如下:
/**
* Created by clearbug on 2018/2/26.
*/
public class Solution {
public static void main(String[] args) {
Solution s = new Solution();
System.out.println(s.isPowerOfThree(13));
System.out.println(s.isPowerOfThree(6561));
}
/**
* 官方解答四:利用了整数的上限
*
* Submission Detail: 64.78%
* Runtime: 71 ms
*
* 时间复杂度:O(1)
* 空间复杂度:O(1)
*
* @param n
* @return
*/
public boolean isPowerOfThree(int n) {
return n > 0 && 1162261467 % n == 0;
}
// 官方解答三:使用了数学上的公式,并且还要处理编程语言中的误差。这个方法我没看太懂,这里就不说了
/**
* 官方解答二:使用进制转换
*
* Submission Detail: 2.38%
* Runtime: 133 ms
*
* 时间复杂度:O(log3n), 这个取决于 Integer.toString 方法的内部实现啦
* 空间复杂度:O(log3n)
*
* @param n
* @return
*/
public boolean isPowerOfThree3(int n) {
if (n < 1) {
return false;
}
return Integer.toString(n, 3).matches("^10*$");
}
/**
* 官方解答一:直接使用循环取余、做除法来解决的,很显然这种方法效率不高,并且题目中提到了不要用循环了
*
* Submission Detail: 61.85%
* Runtime: 73 ms
*
* 时间复杂度:O(log3n)
* 空间复杂度:O(1)
*
* @param n
* @return
*/
public boolean isPowerOfThree2(int n) {
if (n < 1) {
return false;
}
while (n % 3 == 0) {
n = n / 3;
}
return n == 1;
}
/**
* 1, 3, 9, 27, 81, 243, 729, 2187, 6516... 我以为我已经发现了这个问题的诀窍所在了,谁知我却是大错特错的!比如 21 就直接把我的
* 解法摧垮了!无奈了,只能去看官方解答了。。。
*
* @param n
* @return
*/
public boolean isPowerOfThree1(int n) {
int module = n % 10;
return (module == 1 || module == 3 || module == 9 || module == 7)
&& n % 3 == 0;
}
}