leetcode原题链接:https://leetcode.com/problems/power-of-four/description/
今天刷LeetCode发现一道“有魔性”的题,简直不写一个博客记录都对不起我自己!虽然网上有很多解法了,我还是想把我的发出来,绝对是绝无仅有的,哈哈哈哈,搞笑我是认真的!不过题解都是AC了的。不用担心啦~~~
原题是酱紫的:
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次方。首先想到应该是可以用按位与(&),然后就想,既然给出我是在32位以内,是不是可以暴力?
本着“探索精神,我试了一试,结果固然不出乎我意料!!这里贴上我先是试试的代码,AC了!!
第一遍AC:
class Solution {
public:
bool isPowerOfFour(int num) {
switch(num){
case 1:
case 4:
case 4*4:
case 4*4*4:
case 4*4*4*4:
case 4*4*4*4*4:
case 4*4*4*4*4*4:
case 4*4*4*4*4*4*4:
case 4*4*4*4*4*4*4*4:
case 4*4*4*4*4*4*4*4*4:
case 4*4*4*4*4*4*4*4*4*4:
case 4*4*4*4*4*4*4*4*4*4*4:
case 4*4*4*4*4*4*4*4*4*4*4*4:
case 4*4*4*4*4*4*4*4*4*4*4*4*4:
case 4*4*4*4*4*4*4*4*4*4*4*4*4*4:
case 4*4*4*4*4*4*4*4*4*4*4*4*4*4*4:
return true;
}
return false ;
}
};
第二遍AC:
class Solution {
public:
bool isPowerOfFour(int num) {
switch(num){
case 1:
case 4:
case 16:
case 64:
case 256:
case 1024:
case 4096:
case 16384:
case 65536:
case 262144:
case 1048576:
case 4194304:
case 16777216:
case 67108864:
case 268435456:
case 1073741824:
return true;
}
return false ;
}
};
哈哈哈,简直了!要是考这个,我怕是用了一个最简单又最搞笑的方式,估计用下面这个思路的人会鄙视死我!
好了,言归正传,这是最正常的方式,其实思路也简单,一个数 num 如果是 4 的 N 次方必然也是 2 的 N 次方。所以可以先判断 num 是否是 2 的 N 次方。然后再将 2 的 N 次方中那些不是 4 的 N 次方的数去掉。因此就有了下面的代码:
bool isPowerOfFour(int num){
if(num <= 0)returnfalse;
if(num & (num - 1))returnfalse;// 先判断是否是 2 的 N 次方
if(num & 0x55555555)returntrue;// 再将不是 4 的 N 次方的数字去掉
returnfalse;
}
其实就是考了一个小知识点,也还好啦,发现leetcode上面很喜欢考一些进位、按位与、亦或等等的题目,最近刷题真是长见识了。
感觉多多练习这些二进制知识才是王道啊!