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

76 阅读1分钟

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

问题描述

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

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

示例 1:

输入: n = 12
输出: true
解释: 12 = 3^1 + 3^2

示例 2:

输入: n = 91
输出: true
解释: 91 = 3^0 + 3^2 + 3^4

示例 3:

输入: n = 21
输出: false

提示:

  • 1 <= n <= 10^7

思路分析

首先我们要先了解一下题意,题目会给我们一个整数n,我们需要判断可不可以将n拆分成若干个不同的三的幂之和,这里需要注意一下,题目要求的是若干个不同的三的幂之和,也就是说每个数只能用一次,这点我们需要特别注意一下。

  • 1、获取小于等于n的所有3的幂

首先我们可以先将所以小于等于n的所有3的幂计算保存起来,这里我们可以直接使用Math.pow这个函数来计算,当然也可以自己直接在循环中叠加计算。

const arr = [];
let mi = 0;
while(Math.pow(3,mi) <= n){
    arr.push(Math.pow(3,mi++));
}
  • 2、从大到小使用3的幂

我们应该优先使用最大的数字,且每个数字只能使用一次,所以我们可以从大到小依次取值,判断取出的值是否可以使用即可。

while(n > 0 && arr.length){
    const p = arr.pop();
    if(n >= p) n -= p;
}
  • 3、判断是否可以拆分

直接判断最后的n是否为0即可。

return n == 0;

AC代码

完整AC代码如下:

/**
 * @param {number} n
 * @return {boolean}
 */
 var checkPowersOfThree = function(n) {
    const arr = [];
    let mi = 0;
    while(Math.pow(3,mi) <= n){
        arr.push(Math.pow(3,mi++));
    }
    while(n > 0 && arr.length){
        const p = arr.pop();
        if(n >= p) n -= p;
    }
    return n == 0;
};

说在后面

本人为算法业余爱好者,平时只是随着兴趣偶尔刷刷题,如果上面分享有错误的地方,欢迎指出,感激不尽。