Leetcode 326. Power of Three

Leetcode Leetcode。Algorithm。Data Structure

主要想記錄看到一個很有趣的解法,這題非常簡單,就是找到3的冪次方,回傳 true,要挑戰的就是不要用迴圈來完成。

Power of Three

Given an integer n, return true if it is a power of three. Otherwise, return false. An integer n is a power of three, if there exists an integer x such that n == 3x.

一般思路:

  • 不斷除3,直到被整除且無法再除
    • n % 3 == 0 代表還能再除,每次迭代 n /= 3 (n=n/3)
  • 先排除不可能的情況
    • 如果 n < = 0,一定不是 3 的冪次
  • return condition
    • 如果最後 n 剩下 1,就代表原本是 3 的冪次
    • 如果中途有餘數,或者最後不是 1,那就不是

所以實作出來後大概是下面這樣:

/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfThree = function(n) {
  if (n <= 0) return false
  while (n % 3 === 0) {
    n /= 3
  }
  return n === 1
}

巧妙的數學技巧

那有沒有辦法不靠迴圈來整除就可以知道他是 3 的冪次呢

看到一個很有趣的投機取巧的方法,而且也是最快的方法

直接定義一個最大的 3 的冪次,然後看 n 能不能被整除就知道了

/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfThree = function(n) {
    return n > 0 && 1162261467 % n === 0
}

這裡的 1162261467 不是亂寫的,他是3^19 是在 32-bit 整數範圍內最大的 3 的冪次。

原理就是:

  • 如果 n 是 3 的冪,那麼最大的 3 的冪(3^19)一定能被 n 整除。
  • 反之,如果 n 不是 3 的冪,那 3^19 % n 會有餘數。
n = 27
1162261467 % 27 = 0true

n = 9
1162261467 % 9 = 0true

n = 45
1162261467 % 450false