leetcode 231. Power of Two & 326. Power of Three & 342. Power of Four
来源:互联网 发布:2017年互联网金融数据 编辑:程序博客网 时间:2024/05/24 07:24
2的幂转载自 http://blog.csdn.net/hackbuteer1/article/details/6681157
将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0; 因此问题可以转化为判断1后面是否跟了n个0就可以了。
如果将这个数减去1后会发现,仅有的那个1会变为0,而原来的那n个0会变为1;因此将原来的数与去减去1后的数字进行与运算后会发现为零。
最快速的方法:
(number & number - 1) == 0
原因:因为2的N次方换算是二进制为10……0这样的形式(0除外)。与上自己-1的位数,这们得到结果为0。例如。8的二进制为1000;8-1=7,7的二进制为111。两者相与的结果为0。计算如下:
1000
& 0111
-------
0000
下面转载自http://www.cnblogs.com/grandyang/p/5138212.html
3的次方数没有显著的特点,最直接的方法就是不停地除以3,看最后的余数是否为1,要注意考虑输入是负数和0的情况,参见代码如下:
解法一:
class Solution {public: bool isPowerOfThree(int n) { while (n && n % 3 == 0) { n /= 3; } return n == 1; }};
题目中的Follow up让我们不用循环,那么有一个投机取巧的方法,由于输入是int,正数范围是0-231,在此范围中允许的最大的3的次方数为319=1162261467,那么我们只要看这个数能否被n整除即可,参见代码如下:
解法二:
class Solution {public: bool isPowerOfThree(int n) { return (n > 0 && 1162261467 % n == 0); }};
最后还有一种巧妙的方法,利用对数的换底公式来做,高中学过的换底公式为logab = logcb / logca,那么如果n是3的倍数,则log3n一定是整数,我们利用换底公式可以写为log3n = log10n / log103,注意这里一定要用10为底数,不能用自然数或者2为底数,否则当n=243时会出错,原因请看这个帖子。现在问题就变成了判断log10n / log103是否为整数,在c++中判断数字a是否为整数,我们可以用 a - int(a) == 0 来判断,参见代码如下:
解法三:
class Solution {public: bool isPowerOfThree(int n) { return (n > 0 && int(log10(n) / log10(3)) - log10(n) / log10(3) == 0); }};
4的幂:
首先是2的幂,并且2进制中1的位置都是偶数位。
下面是我的代码:
class Solution { public boolean isPowerOfFour(int num) { if(num <= 0) return false; if((num & (num - 1)) == 0 ){ for(int i = 0; i < 32; i++){ if((num & 1) == 1 && i % 2 == 0) return true; num >>>= 1; } } return false; }}
看了大神的代码,发现还有一个很好的思路:
一个数是4的幂,那么减一则是3的倍数,以下摘自大神的代码:
class Solution { public boolean isPowerOfFour(int num) { return num > 0 && (num & (num - 1)) == 0 && (num - 1) % 3 == 0; }}
- Leetcode 231. Power of Two & 326. Power of Three & 342. Power of Four
- 【leetcode】326. Power of Three 231. Power of Two 342. Power of Four
- [LeetCode]231. Power of Two&326. Power of Three&342. Power of Four
- leetcode 231. Power of Two & 326. Power of Three & 342. Power of Four
- Power of two,power of three,power of four
- Leetcode Power of Two/Three/Four
- LeetCode 231. Power of Two & 326. Power of Three
- 231./ 326. /342. Power of Four/ Three /Two
- [LeetCode] Power of Three | Power of Two
- [LeetCode]Power of Four/Power of Three/Power of Two(Java)
- 326. Power of Three / 342. Power of Four
- 326. Power of Three ,231. Power of Two ,
- LeetCode 231,326,342 --Power of Two & Three & Four
- [LeetCode]Power of Four
- Power of Four-Leetcode
- LeetCode Power of Four
- LeetCode - Power of Four
- LeetCode:Power of Four
- 最新高清IT职业技能图谱(15图)
- Linux网络编程基础--socket常用选项
- PAT:1126. Eulerian Path (25)
- ajax中xmlhttp.readyState==4 && xmlhttp.status==200 是什么意思
- Ionic3 Demo
- leetcode 231. Power of Two & 326. Power of Three & 342. Power of Four
- Android onActivityResult setResult的用法
- 按百分比返回数字
- Java实现敏感词过滤代码
- 缓存失效策略(FIFO 、LRU、LFU三种算法的区别)
- java自定义ClassLoader加载指定的class文件
- list多条目加载
- 缓存淘汰算法--LRU算法
- 微信小程序拼团功能之表结构