LeetCode 第 342 题(Power of Four)

Given an integer (signed 32 bits), write a function to check whether it is a power of 4.

Example:

Given num = 16, return true. Given num = 5, return false.

Follow up: Could you solve it without loops/recursion?

题目非常easy, 推断一个数是否是 4 的 N 次方。

难点在于后面的附加条件:不能用循环和递归。

首先先给个用递归的解法。

bool isPowerOfFour(int num)
{
if(num == 1) return true;
if(num <= 0) return false;
if(num & 0x03) return false; return isPowerOfFour(num / 4);
}

然后再给一个用循环的解法:

bool isPowerOfFour(int num)
{
if(num < 0) return false;
do
{
if(num == 1) return true;
if(num & 3) return false;
num = num >> 2;
}while (num);
return false;
}

假设不用循环和递归。也是能够做的。比方穷举全部 4 的 N 次方。

尽管这个代码看起来非常丑陋,可是确实也满足题目的要求。

bool isPowerOfFour(int num)
{
switch(num)
{
case 0x01:
case 0x04:
case 0x10:
case 0x40:
case 0x100:
case 0x400:
case 0x1000:
case 0x4000:
case 0x10000:
case 0x40000:
case 0x100000:
case 0x400000:
case 0x1000000:
case 0x4000000:
case 0x10000000:
case 0x40000000:
return true;
default:
return false;
}
}

讲了这么多,该说说正题了。这个题目事实上考察的是这么一个小知识点。 一个数 num。假设是 2 的 N 次方,那么有:

num & (num - 1) = 0

一个数 num 假设是 4 的 N 次方必定也是 2 的 N 次方。所以能够先推断 num 是否是 2 的 N 次方。然后再将 2 的 N 次方中那些不是 4 的 N 次方的数去掉。因此就有了以下的代码。

bool isPowerOfFour(int num)
{
if(num <= 0) return false;
if(num & (num - 1)) return false; // 先推断是否是 2 的 N 次方
if(num & 0x55555555) return true; // 再将不是 4 的 N 次方的数字去掉
return false;
}

最新文章

  1. React(JSX语法)----动态UI
  2. wince中测试驱动应用程序的实现
  3. Preconditions优雅的检验参数
  4. 《python核心编程》读书笔记--第16章 网络编程
  5. sql2008+vs2008安装心得以及详细教程分享
  6. Android Density(密度)
  7. 怎样在delphi中实现控件的拖拽
  8. 对JavaScript中this的理解
  9. window7 32位安装Oracle11g
  10. Javascript 基础知识2017-03-17
  11. Github上的Android项目介绍之ListViewAnimation(针对listView item的侧滑菜单)(1)
  12. [转]Blue Prism Interview Questions and Answers
  13. 为什么要写 tf.Graph().as_default()
  14. 寒假特训——搜索——H - Nephren gives a riddle
  15. Python2.7-内置类型
  16. c语言实现xor加密
  17. Openwrt之移动硬盘ext3/ext4格式化工具
  18. 编写高质量代码--改善python程序的建议(一)
  19. Rhel6.0部署Oracle10g报错相关问题记录
  20. Java客户端Jedis

热门文章

  1. 纯HTML+CSS写出一颗会飘动的树,有没有惊艳到你呢?
  2. 51nod 1090 3个数和为0【二分】
  3. 浅谈JavaScript中的null和undefined
  4. MathType requires a newer version of MT Extra等MathType问题的不兼容性解决方案
  5. BeanUtils——JavaBean相互转换及字典翻译
  6. espresso 元素遮挡问题。
  7. [置顶] kubernetes资源对象--Label
  8. 无法通过windows installer服务安装此安装程序包。您必须安装带有更新版本windows Installer服务的Windows
  9. 删除windows服务命令
  10. tomcat修改默认访问首页