开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情
前言
小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标1900分,现在1889!!
12月9日每日一题
1780. 判断一个数字是否可以表示成三的幂的和
给你一个整数 n ,如果你可以将 n 表示成若干个不同的三的幂之和,请你返回 true ,否则请返回 false 。
对于一个整数 y ,如果存在整数 x 满足 y == 3x ,我们称这个整数 y 是三的幂。
示例 1:
- 输入: n = 12
- 输出: true
- 解释: 12 = 31 + 32
示例 2:
- 输入: n = 91
- 输出: true
- 解释: 91 = 30 + 32 + 34
示例 3:
- 输入: n = 21
- 输出: false
提示:
1 <= n <= 107
代码
注意,题目说的是若干个不同的三的幂之和,比如6,虽然等于3 + 3但是也是不符合条件的。
这里给出两种做法,第一种,先用一个ArrayList把所有的3的幂存起来,直到3的n次方溢出了int的最大值。
从后往前遍历arraylist,能减则减,每一个至多减一次。
这样如果到最后n已经减为0,则说明可以化简为若干个不同的三的幂之和,返回true。否则则不行,返回false。
方法二
进制转换,对于二进制而言,1011表示 2^0 + 2^1 + 2^3
那对于三进制而言 1011表示 3^0 + 3^1 + 3^3,1211表示 3^0 + 3^1 + 2 * 3^2 + 3^3
3的二次方出现了两次。
题目要求由3的x次方组成,也就意味着3^x要么不出现,要么只出现一次。所以当转换成3进制后,所以位置只能出现0或者1。
解法一
class Solution {
public boolean checkPowersOfThree(int n) {
ArrayList<Integer> arr = new ArrayList<>();
for(int i = 1; i > 0; i = i * 3) {
arr.add(i);
}
for(int i = arr.size() - 1;i >= 0 ;i--){
int temp = arr.get(i);
if(n == 0) return true;
if(n < temp) {
continue;
} else {
n = n - temp;
}
}
if(n == 0) return true;
else return false;
}
}
解法二
class Solution {
public boolean checkPowersOfThree(int n) {
while(n > 0) {
if(n%3==2) return false;
else {
n = n / 3;
}
}
return true;=
}
}