[LeetCode] 231 Power of Two && 326 Power of Three && 342 Power of Four
这三道题目都是一个意思,就是判断一个数是否为2/3/4的幂,这几道题里面有通用的方法,也有各自的方法,我会分别讨论讨论。
原题地址:
231 Power of Two:https://leetcode.com/problems/power-of-two/description/
326 Power of Three:https://leetcode.com/problems/power-of-three/description/
342 Power of Four :https://leetcode.com/problems/power-of-four/description/
解法:
先说一下这类题型的通用解法:
首先肯定是循环了,将n一直除以3,当n最后为1的时候说明这是3的次方数;假如不是3的倍数,即n%3不为0,则不是3的幂。这里要注意的是两个if的顺序不能调转。因为任意数的0次方都为1,所以1肯定是。下面是代码(以Power of Three为例):
class Solution {
public:
bool isPowerOfThree(int n) {
if (n <= ) return false;
for (;;) {
if (n == ) return true;
if (n % != ) return false;
n /= ;
}
}
};
也可以用递归实现,原理其实大同小异(以Power of Four为例):
class Solution {
public:
bool isPowerOfFour(int num) {
if (num <= ) return false;
if (num == ) return true;
if (num % != ) return false;
else return isPowerOfFour(num / );
}
};
最后一种通用的方法很巧妙,是利用数学的方法来实现的(以Power of Three为例)。首先要知道的是,假如一个数是3的幂,那log3n一定是整数,接着利用高中数学中的换底公式(logab = logcb / logca),我们取c=10,则有log10n / log103一定是一个整数。那么我们只需判断log10n / log103是否为整数即可。是,n就是一个3的幂,反之亦然。
给定一个数m,怎么判断它是否整数呢?在C++中,只要m - (int)m == 0,即可说明它是整数。
综上,代码如下:
class Solution {
public:
bool isPowerOfThree(int n) {
return (n > && int(log10(n) / log10()) - log10(n) / log10() == );
}
};
上面就是这类算法题的通用解法了,总结一下,就是循环、递归和数学知识——换底公式的利用。接下来看看各自的特殊解法:
1.Power of Two
我们可以观察一下2的次方数的二进制形式:
1 1
2 10
4 100
8 1000
16 10000
可以看出来,每个2的次方数的二进制形式都仅含一个1,其余为0;根据这个规律,我们可以想出两种方法:
(1)
判断传入的n的最右一位(最低位)是否为1,然后向右一位,统计1的个数,最后加入1的个数为1,那么肯定是2的幂了。代码如下:
class Solution {
public:
bool isPowerOfTwo(int n) {
int cnt = ;
while (n > ) {
cnt += n & ;
n = n >> ;
}
return cnt == ;
}
};
(2)
将这个数-1,然后两个数按位相与,假如这个数是2的幂,所得的数肯定是0。
以8为例。8的二进制为1000,7的二进制为0111,按位相与结果为0。
根据这个方法,代码如下:
class Solution {
public:
bool isPowerOfTwo(int n) {
return (n > && !(n & (n - )));
}
};
2.Power of Three
很可惜,这个没有属于自己的特殊解法。看回上面的通用解法吧!
3.Power of Four
(1)
假如一个数是4的幂指数,那么它首先肯定是2的幂。
因此,这个题目的特殊解法是在Power of Two的特殊解法(2)的基础上拓展的,观察:
1 1
4 100
16 10000
64 1000000
与Power of Two相比,这些二进制数也是只有一个1,但同时也要注意到1的位置全是处于基数位。因此假如一个数是4的幂,它肯定在满足2的幂的条件下,又满足与0x55555555(10101010101.....)按位相与等于它本身的条件。因此实现代码如下:
class Solution {
public:
bool isPowerOfFour(int num) {
return num > && !(num & (num - )) && (num & 0x55555555) == num;
}
};
(2)
观察2的幂:1,2,4,8,16,32,64
观察4的幂:1,4,16,64
可以发现,在2的幂的基础上,只要一个数-1可以被3整除,那么这个数就是4的幂了。(3,15,63可以,7,31不行)
因此实现代码如下:
class Solution {
public:
bool isPowerOfFour(int num) {
return num > && !(num & (num - )) && (num - ) % == ;
}
};
[LeetCode] 231 Power of Two && 326 Power of Three && 342 Power of Four的更多相关文章
- [LeetCode] 342. Power of Four 4的次方数
Given an integer (signed 32 bits), write a function to check whether it is a power of 4. Example:Giv ...
- 231. Power of Two 342. Power of Four -- 判断是否为2、4的整数次幂
231. Power of Two Given an integer, write a function to determine if it is a power of two. class Sol ...
- Power BI for Office 365(三)Power Pivot
在Power Pivot中可以从各种数据源中根据你的需求来创建数据模型,并且可以根据需要随时刷新这些数据.在上一篇中,Anna已经准备好了加载到Power Pivot中的数据.Power Pivot就 ...
- Power BI for Office 365(四)Power View第一部分
Power View是一种可以创建动态的交互式报表的工具,并且支持丰富多样的图表类型,在Power View中创建的报表可以很容易地进行分享,以及供查看报表的用户对Power View报表进行交互.从 ...
- Power BI for Office 365(五)Power View第二部分
继续上一篇Power View 报表的创建, Anna觉得为每一个大类创建一张单独的报表似乎很不现实,所以她决定按照另外一种方式来设计报表,从而满足最终用户想要查看不同大类下的数据的要求. 于是Ann ...
- Power BI for Office 365(七) Power BI站点
报表分享是Power BI for Office 365比较关键的一个功能,其中提供的Power BI站点将给这些报表一个安全的"归宿",同时也可以跟任何想要分享的人进行协作--- ...
- 2019微软Power BI 每月功能更新系列——3月Power BI 新功能学习
Power BI3月产品功能更新发布啦!本次新功能新增了热图和单选切片器:完善了新的DAX功能和对现有功能的改进(例如按钮和选择窗格):同时官方表示建模视图的全面改进也正在进行中~Woo~那么,本月更 ...
- 微软Power BI 每月功能更新系列——11月Power BI 新功能学习
Power BI Desktop11月产品功能摘要 本月Power BI Desktop 有一个大规模的更新.现在,通常可以使用复合模型在一个模型中将直接查询和导入源组合在一起.UserVoice上的 ...
- 微软Power BI 每月功能更新系列——10月Power BI 新功能学习
Power BI Desktop10月产品功能摘要 本月Power Plus Desktop的更新充满了整个产品的小型和大型改进.一个巨大的更新是Power BI服务支持我们的复合模型和聚合预览.这实 ...
随机推荐
- 记一次帮客户做SEO诊断:新站收录后优化一个月了,排名一直没上去
一.网站问题 新网站建设有一个多月了,一直在优化,但是网站一直没有排名,不知道什么原因.接下来针对这个网站分析一下原因. 二.诊断分析 看一下网站的基础数据,如图: < 可以看出来网站只有一个多 ...
- 第二章 [分布式CMS]
结构系统:定义的后台 资源云:存在静态资源文件 文档云:文章内容 工具服务:模板.,公共类 Web服务:处理一下数据交互 为什么要做分布式了? 说实话,我也不太清楚,网上说在性能方面比较好,我的理解是 ...
- fzu1969 GCD Extreme 类似于uva10561
Description Given the value of N, you will have to find the value of G. The meaning of G is given in ...
- JavaScript入门(四)
一.数组 1.数组的基本概念 数组是在内存空间中连续存储的一组有序数据的集合.元素在数组中的顺序,称为下标.可以使用下标访问数组的每个元素. 2.如何声明一个数组 ①使用字面量声明:var arr = ...
- [2014-08-28]Mac系统上的几个命令解释器(控制台)
irb 语言:Ruby 帮助:help 清屏:CTRL+L 自动完成:Tab+Tab (若未开启,则在/etc/irbrc中require 'irb/completion') 退出:quit/exit ...
- 对Appium的认识 get
介绍 Appium是一个开源.跨平台的测试框架,可以用来测试原生及混合的移动端应用.Appium支持iOS.Android及FirefoxOS平台测试.Appium使用WebDriver的json w ...
- Grails笔记三:完整的文件上传实例
文件上传在web应用中是比较普遍的,相对于使用jsp等技术实现文件上传,Grails的文件上传着实让人喜爱,因为极其简单,让人看一遍就容易轻松记住!不多说,实例如下: 假设已有一个名为uploadFi ...
- [js高手之路]深入浅出webpack教程系列5-插件使用之html-webpack-plugin配置(中)
上文我们讲到了options的配置和获取数据的方式,本文,我们继续深入options的配置 一.html-webpack-plugin插件中的options除了自己定义了一些基本配置外,我们是可以任意 ...
- echarts用法
参考文档: https://github.com/xlsdg/vue-echarts-v3 1.下载echarts插件 $ npm install --save vue-echarts-v3 2.引入 ...
- VMware bridge 桥接方式连接internet
经过反复测试,关于VMware内虚拟机(包括ubuntu linux和windows)连接internet 目前的结论是 使用bridge方式时,VMware相当于一个交换机(switch),虚拟机和 ...