开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
};
说在后面
本人为算法业余爱好者,平时只是随着兴趣偶尔刷刷题,如果上面分享有错误的地方,欢迎指出,感激不尽。