算法日志 --- 12.09---判断一个数字是否可以表示成三的幂的和

139 阅读2分钟

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

快乐周五,也不算特别快乐,今天该忙别的了

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

该题出自力扣的1780题 —— 判断一个数字是否可以表示成三的幂的和【中等题】

审题

给你一个整数 n ,如果你可以将 n 表示成若干个不同的三的幂之和,请你返回 true ,否则请返回 false 。 对于一个整数 y ,如果存在整数 x 满足 y == 3x ,我们称这个整数 y 是三的幂。

  • 今天这道居然是中等题,确实是没有想到的,可以说是和简单题比肩了
  • 给出一个整型数字,如果可以将这个数字切割为若干个不一样的3的幂之和,就返回true,否则返回false
  • 那么3的幂之和,换位思考一下,如果转换为3进制的话那就很好理解了,3进制的话,只有0/1/2三种字符,逢三进一,结合题意,需要不一样的3的幂之和,那么就是判断是否存在2的余数即可
  • 解答:遍历该数字,如果不为0的话,则继续遍历
    • 我们通过对n进行除3取余操作,如果获得01,则表示满足三进制,依次类推,直到除完为止。如果在除3取余过程中,不满足0或者1,则直接返回false
    • 三进制 1 1 0 1 代表 1 * 3^3 + 1 * 3^2 + 0 * 3^1 + 1
    • 三进制 2 1 0 1 代表 2 * 3^3 + 1 * 3^2 + 0 * 3^1 + 1
    • 这样就有两个3^3,不符合题意, 所以判断三进制每一位有没有2即可
    • 时间复杂度:O(logn),即为进制转换需要的时间。
  • 空间复杂度:O(1)。

编码

class Solution {
    public boolean checkPowersOfThree(int n) {
        while (n != 0){
            if (n % 3 == 2)return false;
            n /=3;
        }
        return true;
    }
}

image.png