【每日一题Day51】LC1780判断一个数字是否可以表示成三的幂之和 | 进制转换

简介: 思路:当我们把二进制转换为十进制时,采用的方法是二的幂之和。那么,本题可以将十进制转换为三进制,当所有位的值为0或者1时,满足题意,返回true;但有一位值为2时,返回false

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


Given an integer n, return true if it is possible to represent n as the sum of distinct powers of three. Otherwise, return false.


An integer y is a power of three if there exists an integer x such that y == 3x.


属实想不到


进制转换


  • 思路:当我们把二进制转换为十进制时,采用的方法是二的幂之和。那么,本题可以将十进制转换为三进制,当所有位的值为0或者1时,满足题意,返回true;但有一位值为2时,返回false


  • 实现


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


。复杂度


  • 时间复杂度:O(logn)
  • 空间复杂度:O ( 1 )


二分


  • 思路:小于1 0 7 的3的幂次方一共只有15个,因此可以先打表,然后二分查找最接近target的3的幂次方,如果已经使用过该三进制或者target<0,那么返回false;当target==0时,返回true【感觉也是有点进制转换在里面的】


  • 实现


class Solution {
    public boolean checkPowersOfThree(int n) {
        int[] tri = new int[16];
        for(int i = 0;i<16;i++){
            tri[i] = (int)Math.pow(3,i);
        }
        int temp = n;
        boolean[] vis = new boolean[16];
        int l = 0,r = 15;
        while(temp > 0){
            l = 0;
            while(l<r){
                int mid = l + r + 1 >> 1;
                if(tri[mid] > temp) r = mid - 1;
                else l = mid;
            }
            if(vis[l]) return false;
            temp -= tri[l];
            vis[l] = true;
        }
        return temp == 0;
    }
}


。复杂度


  • 时间复杂度:O(logn)
  • 空间复杂度:O ( C )
目录
相关文章
|
5月前
【每日一题Day202】LC1015可被 K 整除的最小整数 | 模运算
【每日一题Day202】LC1015可被 K 整除的最小整数 | 模运算
49 2
|
5月前
【每日一题Day127】LC1238循环码排列 | 格雷码构造 位运算
【每日一题Day127】LC1238循环码排列 | 格雷码构造 位运算
46 0
【每日一题Day127】LC1238循环码排列 | 格雷码构造 位运算
|
5月前
|
算法
【每日一题Day347】LC136只出现一次的数字 | 位运算
【每日一题Day347】LC136只出现一次的数字 | 位运算
46 0
|
5月前
|
算法
【每日一题Day349】LC260只出现一次的数字 III | 位运算
【每日一题Day349】LC260只出现一次的数字 III | 位运算
38 0
|
5月前
【每日一题Day359】LC2520统计能整除数字的位数 | 数学模拟
【每日一题Day359】LC2520统计能整除数字的位数 | 数学模拟
45 0
|
5月前
【每日一题Day210】LC1073负二进制数相加 | 模拟
【每日一题Day210】LC1073负二进制数相加 | 模拟
30 0
|
5月前
【每日一题Day268】LC415字符串相加 | 模拟
【每日一题Day268】LC415字符串相加 | 模拟
42 0
|
5月前
【每日一题Day194】LC970强整数 | 枚举
【每日一题Day194】LC970强整数 | 枚举
34 0
|
5月前
【每日一题Day169】LC1107负二进制转换 | 模拟进位 位运算
【每日一题Day169】LC1107负二进制转换 | 模拟进位 位运算
31 1
|
5月前
|
C语言
[C语言][题]获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
[C语言][题]获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
41 0