LeetCode 每日一题:判断一个数字是否可以表示成三的幂的和

114 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 10 天,点击查看活动详情

判断一个数字是否可以表示成三的幂的和

原题地址

给你一个整数 n ,如果你可以将 n 表示成若干个不同的三的幂之和,请你返回 true ,否则请返回 false 。

对于一个整数 y ,如果存在整数 x 满足 y ==3x3^x ,我们称这个整数 y 是三的幂。

示例 1:

输入:n = 12
输出:true
解释:12 = 31 + 32

示例 2:

输入:n = 91
输出:true
解释:91 = 30 + 32 + 34

示例 3:

输入:n = 21
输出:false

提示:

  • 1 <= n <=10710^7

思路分析

方法一

  1. 分析题目,计算规律,若数字满足是若干个 3 的幂之和,那么必定满足 n%3 === 0 或者 (n-1)%3 === 0,那么我们可以考虑将 n 转换成 3 的进制,若 n 的 3进制中的每一位都不为 2,那么返回值为 true,否则就返回 false
  2. 以示例中的数据来推测计算下:n=12 转换成三进制是 110,可以拆分 313^1+323^2,而 n=21 转换成三进制是 210,就不满足需求。

方法二

还是按照方法一的将数据转换成三进制,查看是否有为2的数据,javascript 中可以使用 number.toString(radix) 来计算十进制数值转换成 radix 进制的方法,因此我们使用 n.toString(3) 转换成三进制数据后,寻找其中是否有为2的字符,然后返回 index === -1 即可。

AC 代码

方法一

/**
 * @param {number} n
 * @return {boolean}
 */
var checkPowersOfThree = function(n) {
    while (n !== 0) {
        if (n % 3 === 2) {
            return false
        }
        n = Math.floor(n / 3)
    }
    return true
};

结果:

  • 执行结果: 通过
  • 执行用时:60 ms, 在所有 JavaScript 提交中击败了54.55%的用户
  • 内存消耗:41 MB, 在所有 JavaScript 提交中击败了81.82%的用户
  • 通过测试用例:129 / 129

方法二

/**
 * @param {number} n
 * @return {boolean}
 */
var checkPowersOfThree = function(n) {
    let three = n.toString(3)
    let res = three.indexOf('2')
    return res === -1
};

结果:

  • 执行结果: 通过
  • 执行用时:48 ms, 在所有 JavaScript 提交中击败了100.00%的用户
  • 内存消耗:41 MB, 在所有 JavaScript 提交中击败了81.82%的用户
  • 通过测试用例:129 / 129

END