326. Power of Three

1. 問題描述

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?
Tags: Math
Similar Problems: (E) Power of Two (E) Power of Fourc++

2. 解題思路

判斷一個數是否爲3的次方數,且不能使用循環或遞歸,即要求時間和空間複雜度都爲常數!oop

  • 思路1:不停地除以3,判斷最後的餘數是否爲1。注意:需考慮輸入是負數和0的狀況!
  • 思路2:利用對數的換底公式來作,換底公式爲logab = logcb / logca,那麼若是n是3的倍數,則log3n必定是整數,咱們利用換底公式能夠寫爲log3n = log10n / log103,注意這裏必定要用10爲底數,不能用天然數或者2爲底數,不然當n=243時會出錯,緣由請看這個帖子。如今問題就變成了判斷log10n / log103是否爲整數,在c++中判斷數字a是否爲整數,咱們能夠用 a - int(a) == 0 來判斷。
  • 思路3:因爲輸入是int,正數範圍是0-231,在此範圍中容許的最大的3的次方數爲319=1162261467,那麼只要看這個數可否被n整除便可。

3. 代碼

 思路1
spa

1 class Solution {
2 public:
3     bool isPowerOfThree(int n) {
4         while (n && n % 3 == 0) {
5             n /= 3;
6         }
7         return n == 1;
8     }
9 };

 思路2code

 1 class Solution {
 2 public:
 3     bool isPowerOfThree(int n) {
 4         if(n==0)
 5             return false;
 6         if ((math.log10(n) / (math.log10(3))) - (int) ((math.log10(n) / (math.log10(3)))) ==0) 
 7         {
 8             return true;
 9         }
10         return false;
11     }
12 };

 思路3blog

1 class Solution {
2     public:
3         bool isPowerOfThree(int n) {
4             return (n > 0 && 1162261467 % n == 0);
5         }
6     };

4. 反思

相關文章
相關標籤/搜索