Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode 1780. 判断一个数字是否可以表示成三的幂的和(位运算)

LeetCode 1780. 判断一个数字是否可以表示成三的幂的和(位运算)

作者头像
Michael阿明
发布于 2021-09-06 02:10:05
发布于 2021-09-06 02:10:05
62500
代码可运行
举报
运行总次数:0
代码可运行

文章目录

1. 题目

给你一个整数 n ,如果你可以将 n 表示成若干个不同的三的幂之和,请你返回 true ,否则请返回 false 。

对于一个整数 y ,如果存在整数 x 满足 y==3x,我们称这个整数 y 是三的幂。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
示例 1:
输入:n = 12
输出:true
解释:12 = 3^1 + 3^2

示例 2:
输入:n = 91
输出:true
解释:91 = 3^0 + 3^2 + 3^4

示例 3:
输入:n = 21
输出:false
 
提示:
1 <= n <= 10^7

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/check-if-number-is-a-sum-of-powers-of-three 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 系数每一位是 0 或者 1,用数据范围内的 二进制数枚举系数的组合
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    bool checkPowersOfThree(int n) {
        int s = (1<<15);
        vector<int> pow3(16, 1);
        for(int i = 1; i <= 15; i++)
            pow3[i] = pow3[i-1]*3;
        for(int i = 0; i <= s; i++) 
        {	// 系数是 i 
            int num = 0;
            for(int j = 0; j <= 15; j++)
            {
                if(1&(i>>j))//第 j 位系数 是 1
                    num += pow3[j];
            }
            if(num == n)
                return true;
        }
        return false;
    }
};

292 ms 5.9 MB C++

  • 从最大的位开始减
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    bool checkPowersOfThree(int n) {
        int s = (1<<15);
        vector<int> pow3(16, 1);
        for(int i = 1; i <= 15; i++)
            pow3[i] = pow3[i-1]*3;
        for(int i = 15; i >= 0; --i)
        {	
            if(n >= pow3[i])
                n -= pow3[i];
        }
        return n==0;
    }
};

0 ms 5.9 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode 1922. 统计好数字的数目(快速幂)
我们称一个数字字符串是 好数字 当它满足(下标从 0 开始)偶数 下标处的数字为 偶数 且 奇数 下标处的数字为 质数 (2,3,5 或 7)。
Michael阿明
2021/09/06
2870
LeetCode 1829. 每个查询的最大异或值(前缀异或 + 位运算)
给你一个 有序 数组 nums ,它由 n 个非负整数组成,同时给你一个整数 maximumBit 。你需要执行以下查询 n 次:
Michael阿明
2021/09/06
5270
LeetCode 1718. 构建字典序最大的可行序列(贪心+回溯)
序列里面两个数 a[i] 和 a[j] 之间的 距离 ,我们定义为它们下标绝对值之差 |j - i| 。
Michael阿明
2021/09/06
6040
LeetCode 1952. 三除数
给你一个整数 n 。如果 n 恰好有三个正除数 ,返回 true ;否则,返回 false 。
Michael阿明
2021/09/06
2330
LeetCode 1835. 所有数对按位与结果的异或和(位运算 (a&b)^(a&c) = a&(b^c) )
列表的 异或和(XOR sum)指对所有元素进行按位 XOR 运算的结果。 如果列表中仅有一个元素,那么其 异或和 就等于该元素。
Michael阿明
2021/09/06
7630
LeetCode 1940. 排序数组之间的最长公共子序列(二分查找)
给定一个由整数数组组成的数组arrays,其中arrays[i]是严格递增排序的,返回一个表示所有数组之间的最长公共子序列的整数数组。
Michael阿明
2021/09/06
4860
LeetCode 1879. 两个数组最小的异或值之和(状态压缩DP)
两个数组的 异或值之和 为 (nums1[0] XOR nums2[0]) + (nums1[1] XOR nums2[1]) + ... + (nums1[n - 1] XOR nums2[n - 1]) (下标从 0 开始)。
Michael阿明
2021/09/06
7750
LeetCode 1814. 统计一个数组中好对子的数目(哈希)
给你一个数组 nums ,数组中只包含非负整数。 定义 rev(x) 的值为将整数 x 各个数字位反转得到的结果。 比方说 rev(123) = 321 , rev(120) = 21 。我们称满足下面条件的下标对 (i, j) 是 好的 :
Michael阿明
2021/09/06
3030
LeetCode 1828. 统计一个圆中点的数目
给你一个数组 points ,其中 points[i] = [xi, yi] ,表示第 i 个点在二维平面上的坐标。多个点可能会有 相同 的坐标。
Michael阿明
2021/09/06
4480
LeetCode 1838. 最高频元素的频数(二分查找)
给你一个整数数组 nums 和一个整数 k 。 在一步操作中,你可以选择 nums 的一个下标,并将该下标对应元素的值增加 1 。
Michael阿明
2021/09/06
4490
LeetCode 1899. 合并若干三元组以形成目标三元组
三元组 是一个由三个整数组成的数组。 给你一个二维整数数组 triplets ,其中 triplets[i] = [ai, bi, ci] 表示第 i 个 三元组 。 同时,给你一个整数数组 target = [x, y, z] ,表示你想要得到的 三元组 。
Michael阿明
2021/09/06
3930
LeetCode 1886. 判断矩阵经轮转后是否一致
给你两个大小为 n x n 的二进制矩阵 mat 和 target 。 现 以 90 度顺时针轮转 矩阵 mat 中的元素 若干次 ,如果能够使 mat 与 target 一致,返回 true ; 否则,返回 false 。
Michael阿明
2021/09/06
2300
LeetCode 878. 第 N 个神奇数字(二分查找)
我的CSDN博客地址 https://michael.blog.csdn.net/
Michael阿明
2021/09/06
3120
LeetCode 1871. 跳跃游戏 VII(贪心)
给你一个下标从 0 开始的二进制字符串 s 和两个整数 minJump 和 maxJump 。 一开始,你在下标 0 处,且该位置的值一定为 '0' 。 当同时满足如下条件时,你可以从下标 i 移动到下标 j 处:
Michael阿明
2021/09/06
1970
LeetCode 1878. 矩阵中最大的三个菱形和(模拟)
菱形和 指的是 grid 中一个正菱形 边界 上的元素之和。 本题中的菱形必须为正方形旋转45度,且四个角都在一个格子当中。 下图是四个可行的菱形,每个菱形和应该包含的格子都用了相应颜色标注在图中。
Michael阿明
2021/09/06
2900
LeetCode 1554. 只有一个不同字符的字符串(枚举)
当存在两个字符串在相同索引处只有一个字符不同时,返回 True ,否则返回 False 。
Michael阿明
2021/09/06
3930
LeetCode 1893. 检查是否区域内所有整数都被覆盖(差分)
给你一个二维整数数组 ranges 和两个整数 left 和 right 。每个 ranges[i] = [starti, endi] 表示一个从 starti 到 endi 的 闭区间 。
Michael阿明
2021/09/06
4760
LeetCode 1707. 与数组中元素的最大异或值(Trie树)
给你一个由非负整数组成的数组 nums 。另有一个查询数组 queries ,其中 queries[i] = [xi, mi] 。
Michael阿明
2021/09/06
4420
LeetCode 第 33 场双周赛(511/3304,前15.5%,第4次全部通过)
全国排名: 511 / 3304,15.5%;全球排名: 1626 / 11366,14.3%
Michael阿明
2021/02/19
3340
LeetCode 1856. 子数组最小乘积的最大值(前缀和 + 单调栈)
比方说,数组 [3,2,5] (最小值是 2)的最小乘积为 2 * (3+2+5) = 2 * 10 = 20 。 给你一个正整数数组 nums ,请你返回 nums 任意 非空子数组 的最小乘积 的 最大值 。由于答案可能很大,请你返回答案对 10^9 + 7 取余 的结果。
Michael阿明
2021/09/06
8140
推荐阅读
相关推荐
LeetCode 1922. 统计好数字的数目(快速幂)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档