开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 10 天,点击查看活动详情。
判断一个数字是否可以表示成三的幂的和
原题地址
给你一个整数 n ,如果你可以将 n 表示成若干个不同的三的幂之和,请你返回 true ,否则请返回 false 。
对于一个整数 y ,如果存在整数 x 满足 y == ,我们称这个整数 y 是三的幂。
示例 1:
输入:n = 12
输出:true
解释:12 = 31 + 32
示例 2:
输入:n = 91
输出:true
解释:91 = 30 + 32 + 34
示例 3:
输入:n = 21
输出:false
提示:
1 <= n <=
思路分析
方法一
- 分析题目,计算规律,若数字满足是若干个
3的幂之和,那么必定满足n%3 === 0或者(n-1)%3 === 0,那么我们可以考虑将n转换成3的进制,若n的 3进制中的每一位都不为2,那么返回值为true,否则就返回false。 - 以示例中的数据来推测计算下:
n=12转换成三进制是110,可以拆分+,而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