【一天一道LeetCode】#342. Power of Four
2016-07-16 21:45
232 查看
一天一道LeetCode
本系列文章已全部上传至我的github,地址:ZeeCoder‘s Github欢迎大家关注我的新浪微博,我的新浪微博
欢迎转载,转载请注明出处
(一)题目
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?
(二)解题
题目大意:判断一个数是不是4的n次方数。解题思路:可以参考:【一天一道LeetCode】#326. Power of Three和【一天一道LeetCode】#231. Power of Two
首先,最简单的方法,采用循环来做:
class Solution { public: bool isPowerOfFour(int num) { int n = num; while(n>0&&n%4==0) { n/=4; } return n==1; } };
题目中有提问说能不能不用循环和递归来做,和判断3的n次方数一样,4的n次方数在整形数内只有16个,很快就能列举出来,也不失为一个好办法。
另外观察4的n次方数和2的n次方数,可以看出,2的n次方数中能开方得到整数的均为4的n次方数。
class Solution { public: //三个条件:大于0,是2的n次方数,开方后得到整数 bool isPowerOfFour(int num) { return (num>0)&&!(num&(num-1))&&(sqrt(num)*sqrt(num)==num); } };
在leetcode的讨论区看到这样一个答案,很巧妙。
首先判断num是不是2的n次方数,在判断他与0xaaaaaaaa相与是否为0。
4的n次方数有一个特点就是,在bit位上,第0,2,4,6,8,10….位上为1,
所以,先判断是不是3的n次方数,就保证了有且仅有一位上为1的数,然后在剔除奇数位上为1的数,剩下的就是4的n次方数了。
class Solution { public: bool isPowerOfFour(int num) { //三个条件:大于0,是2的n次方数,有且仅有偶数位上为1 return (num>0)&&!(num&(num-1))&&!(num&0xaaaaaaaa); } };
相关文章推荐
- Java JVM 多态(动态绑定)
- 关于tomcat的问题
- 接站
- w3c css参考网址
- BZOJ 1355 [Baltic2009]Radio Transmission
- linux运维社区
- Ugly Number II
- 线程(代码实现)详解
- JMenuBar,JMenu,JMenuItem的关系
- OpenGL 纹理单元 纹理目标 理解 glActiveTexture glBindTexture
- SCPPO(九):性能优化之停工装置按照开工装置更新价格
- c++ string的实现。
- 初谈递归:程序员为什么要学好数学?
- 1056. Mice and Rice (25)
- 24 二叉搜索树的后序遍历序列
- 每个程序员都应该学习使用Python或Ruby
- 权限管理——用户认证和用户授权
- Android系统发送短信
- 操作系统之进程的调度与死锁
- HDU 3966 Aragorn's Story (树链剖分 基于点权)