这三道题目都是一个意思,就是判断一个数是否为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为例):

  1. class Solution {
  2. public:
  3. bool isPowerOfThree(int n) {
  4. if (n <= ) return false;
  5. for (;;) {
  6. if (n == ) return true;
  7. if (n % != ) return false;
  8. n /= ;
  9. }
  10. }
  11. };

也可以用递归实现,原理其实大同小异(以Power of Four为例):

  1. class Solution {
  2. public:
  3. bool isPowerOfFour(int num) {
  4. if (num <= ) return false;
  5. if (num == ) return true;
  6. if (num % != ) return false;
  7. else return isPowerOfFour(num / );
  8. }
  9. };

最后一种通用的方法很巧妙,是利用数学的方法来实现的(以Power of Three为例)。首先要知道的是,假如一个数是3的幂,那log3n一定是整数,接着利用高中数学中的换底公式(logab = logcb / logca),我们取c=10,则有log10n / log103一定是一个整数。那么我们只需判断log10n / log103是否为整数即可。是,n就是一个3的幂,反之亦然。

给定一个数m,怎么判断它是否整数呢?在C++中,只要m - (int)m == 0,即可说明它是整数。

综上,代码如下:

  1. class Solution {
  2. public:
  3. bool isPowerOfThree(int n) {
  4. return (n > && int(log10(n) / log10()) - log10(n) / log10() == );
  5. }
  6. };

上面就是这类算法题的通用解法了,总结一下,就是循环、递归和数学知识——换底公式的利用。接下来看看各自的特殊解法:

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的幂了。代码如下:

  1. class Solution {
  2. public:
  3. bool isPowerOfTwo(int n) {
  4. int cnt = ;
  5. while (n > ) {
  6. cnt += n & ;
  7. n = n >> ;
  8. }
  9. return cnt == ;
  10. }
  11. };

(2)

将这个数-1,然后两个数按位相与,假如这个数是2的幂,所得的数肯定是0。

以8为例。8的二进制为1000,7的二进制为0111,按位相与结果为0。

根据这个方法,代码如下:

  1. class Solution {
  2. public:
  3. bool isPowerOfTwo(int n) {
  4. return (n > && !(n & (n - )));
  5. }
  6. };

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.....)按位相与等于它本身的条件。因此实现代码如下:

  1. class Solution {
  2. public:
  3. bool isPowerOfFour(int num) {
  4. return num > && !(num & (num - )) && (num & 0x55555555) == num;
  5. }
  6. };

(2)

观察2的幂:1,2,4,8,16,32,64

观察4的幂:1,4,16,64

可以发现,在2的幂的基础上,只要一个数-1可以被3整除,那么这个数就是4的幂了。(3,15,63可以,7,31不行)

因此实现代码如下:

  1. class Solution {
  2. public:
  3. bool isPowerOfFour(int num) {
  4. return num > && !(num & (num - )) && (num - ) % == ;
  5. }
  6. };

[LeetCode] 231 Power of Two && 326 Power of Three && 342 Power of Four的更多相关文章

  1. [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 ...

  2. 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 ...

  3. Power BI for Office 365(三)Power Pivot

    在Power Pivot中可以从各种数据源中根据你的需求来创建数据模型,并且可以根据需要随时刷新这些数据.在上一篇中,Anna已经准备好了加载到Power Pivot中的数据.Power Pivot就 ...

  4. Power BI for Office 365(四)Power View第一部分

    Power View是一种可以创建动态的交互式报表的工具,并且支持丰富多样的图表类型,在Power View中创建的报表可以很容易地进行分享,以及供查看报表的用户对Power View报表进行交互.从 ...

  5. Power BI for Office 365(五)Power View第二部分

    继续上一篇Power View 报表的创建, Anna觉得为每一个大类创建一张单独的报表似乎很不现实,所以她决定按照另外一种方式来设计报表,从而满足最终用户想要查看不同大类下的数据的要求. 于是Ann ...

  6. Power BI for Office 365(七) Power BI站点

    报表分享是Power BI for Office 365比较关键的一个功能,其中提供的Power BI站点将给这些报表一个安全的"归宿",同时也可以跟任何想要分享的人进行协作--- ...

  7. 2019微软Power BI 每月功能更新系列——3月Power BI 新功能学习

    Power BI3月产品功能更新发布啦!本次新功能新增了热图和单选切片器:完善了新的DAX功能和对现有功能的改进(例如按钮和选择窗格):同时官方表示建模视图的全面改进也正在进行中~Woo~那么,本月更 ...

  8. 微软Power BI 每月功能更新系列——11月Power BI 新功能学习

    Power BI Desktop11月产品功能摘要 本月Power BI Desktop 有一个大规模的更新.现在,通常可以使用复合模型在一个模型中将直接查询和导入源组合在一起.UserVoice上的 ...

  9. 微软Power BI 每月功能更新系列——10月Power BI 新功能学习

    Power BI Desktop10月产品功能摘要 本月Power Plus Desktop的更新充满了整个产品的小型和大型改进.一个巨大的更新是Power BI服务支持我们的复合模型和聚合预览.这实 ...

随机推荐

  1. Yii2 报错Getting unknown property: app\models\Product::

    解决方法:查看是否存在 "$a->$abc"的写法,应改成$a->abc

  2. 面试题1 -- Java 中,怎么在格式化的日期中显示时区?

    使用SimpleDateFormat来实现格式化日期 import java.text.SimpleDateFormat; import java.util.Date; public class Da ...

  3. PyQt:昨天今天明天表示方法

    PyQt中今天的表示方法如下: QtCore.QDate.currentDate() 那么,明天怎么表示呢? today=QtCore.QDate.currentDate().toJulianDay( ...

  4. mysql事件机制——定时任务

    定时任务是老生常谈了,因为我们总是需要定时修改特定的数据. 实现它的方法肯定不止一种,但我在相当长一段时间里都是用程序编码去做的,今天突然想到“为什么一定要采用调用的方式?”,用数据库自身的能力去实现 ...

  5. Html5笔记之小结

    随着Android,IOS手机,平板等各种App的不断扩增,加上对过去传统HTML的的各种不完善,例如视频依靠Flash,对手机和桌面的不兼容等等.HTML5来了,来解决这些问题了. Html5是W3 ...

  6. 常用Linux操作指令

    -------------------------------Linux目录------------------------------- /:根目录,一般根目录下只存放目录,在Linux下有且只有一 ...

  7. github+hexo搭建自己的博客网站(六)进阶配置(搜索引擎收录,优化你的url)

    详细的可以查看hexo博客的演示:https://saucxs.github.io/ 绑定了域名: http://www.chengxinsong.cn hexo+github博客网站源码(可以clo ...

  8. JS中的DOM操作和事件

    [DOM树节点] DOM节点分为三大类: 元素节点. 属性节点. 文本节点: 文本节点.属性节点属于元素节点的子节点.操作时,均需要先取到元素节点,再操作子节点:可以使用getElement系列方法, ...

  9. Ubuntu16.04下安装texlive

    Ubuntu 16.04下安装texlive的步骤如下: 1.下载texlive 打开终端输入:sudo apt-get install texlive-full  #下载这一过程会持续10-20分钟 ...

  10. 百度AI开放平台- API实战调用

    百度AI开放平台- API实战调用 一.      前言 首先说一下项目需求. 两个用户,分别上传了两段不同的文字,要计算两段文字相似度有多少,匹配数据库中的符合条件的数据,初步估计列出来会有60-1 ...