231. Power of Two
2016-06-18 15:59
239 查看
题目:
Given an integer, write a function to determine if it is a power of two.
题意:
给定一个整数,写一个程序检测该整数是否是2的幂。
思路一:
最直接的方法就是不停地除以2,看最后的余数是否为1,要注意考虑输入是负数和0的情况。
代码:递归版:8ms
思路二:
观察下2的次方数的二进制写法的特点:
1 2 4 8 16 ....
1 10 100 1000 10000 ....
那么我们很容易看出来2的次方数都只有一个1,剩下的都是0,所以我们的解题思路就有了,我们只要每次判断最低位是否为1,然后向右移位,最后统计1的个数即可判断是否是2的次方数。
代码:8ms
思路三:
这道题还有一个技巧,如果一个数是2的次方数的话,根据上面分析,那么它的二进数必然是最高位为1,其它都为0,那么如果此时我们减1的话,则最高位会降一位,其余为0的位现在都为变为1,那么我们把两数相与,就会得到0,用这个性质也能来解题,而且只需一行代码就可以搞定。
代码:9ms
Given an integer, write a function to determine if it is a power of two.
题意:
给定一个整数,写一个程序检测该整数是否是2的幂。
思路一:
最直接的方法就是不停地除以2,看最后的余数是否为1,要注意考虑输入是负数和0的情况。
代码:递归版:8ms
class Solution { public: bool isPowerOfTwo(int n) { return n>0 && (n==1 || (n%2==0 && isPowerOfTwo(n/2))); } };代码:轮询版:8ms
class Solution { public: bool isPowerOfTwo(int n) { while(n && n%2==0){ n /= 2; } return n==1; } };
思路二:
观察下2的次方数的二进制写法的特点:
1 2 4 8 16 ....
1 10 100 1000 10000 ....
那么我们很容易看出来2的次方数都只有一个1,剩下的都是0,所以我们的解题思路就有了,我们只要每次判断最低位是否为1,然后向右移位,最后统计1的个数即可判断是否是2的次方数。
代码:8ms
class Solution { public: bool isPowerOfTwo(int n) { int count = 0; while(n>0){ count += (n&1); n >>= 1; } return count==1; } };
思路三:
这道题还有一个技巧,如果一个数是2的次方数的话,根据上面分析,那么它的二进数必然是最高位为1,其它都为0,那么如果此时我们减1的话,则最高位会降一位,其余为0的位现在都为变为1,那么我们把两数相与,就会得到0,用这个性质也能来解题,而且只需一行代码就可以搞定。
代码:9ms
class Solution { public: bool isPowerOfTwo(int n) { return (n>0) && (!(n&(n-1))); } };
相关文章推荐
- Apache Commons工具集简介
- 基础问题记录
- iOS-Button点击无反应的原因
- iOS运行时初探-使用运行时机制向Category中添加属性
- JavaScript 严格模式 use strict
- JAVA之旅(十七)——StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder
- JAVA之旅(十七)——StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder
- 欢迎使用CSDN-markdown编辑器
- duilib + cef简单浏览器的demo
- centos6.x直接yum安装nginx1.10.x
- 如果你知道如何使用这个技能,就根本不需要担心工作了……
- RabbitMq、ActiveMq、ZeroMq、kafka之间的比较,资料汇总
- 安卓侧边栏实现
- 给国外老师写邮件
- "CoolShell puzzle game" writeup
- 抓包工具fiddler
- 《梦溪笔谈》三则--古代的逻辑思辨
- Yii 2.0 Widget的编写
- ListView应用Demo使用自定义的适配器继承BaseAdapter
- 6月份学习计划