[杨小白]_leetcode_力扣_12月9日每日一题_1780. 判断一个数字是否可以表示成三的幂的和

96 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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;=
    }
}