漫画算法:判断2的乘方

最近几天有点学懵了,心态有些小小的问题,可能是受到了台风的影响亦或者是没有及时寄存好的知识, 今天学点有趣的东西,放松放松
转载自:玻璃猫大神的博客

漫画算法:判断2的乘方_第1张图片
漫画算法:判断2的乘方_第2张图片
漫画算法:判断2的乘方_第3张图片
漫画算法:判断2的乘方_第4张图片
小灰陷入回忆当中。。。。
漫画算法:判断2的乘方_第5张图片
漫画算法:判断2的乘方_第6张图片
漫画算法:判断2的乘方_第7张图片
题目:实现一个方法,判断一个正整数是否是2的乘方(比如16是2的4次方,返回True;18不是2的乘方,返回False)。要求性能尽可能高。
漫画算法:判断2的乘方_第8张图片
漫画算法:判断2的乘方_第9张图片
解法一:
创建一个中间变量Temp,初始值是1。然后进入一个循环,循环中每次让Temp和目标整数比较,如果相等,则说明目标整数是2的乘方;如果不相等,则让Temp增大一倍,继续循环比较。当Temp大于目标整数时,说明目标整数不是2的乘方。

如果目标整数的大小是N,则此方法的时间复杂度是O(LogN)。
漫画算法:判断2的乘方_第10张图片
漫画算法:判断2的乘方_第11张图片
漫画算法:判断2的乘方_第12张图片
漫画算法:判断2的乘方_第13张图片
漫画算法:判断2的乘方_第14张图片
漫画算法:判断2的乘方_第15张图片
漫画算法:判断2的乘方_第16张图片
漫画算法:判断2的乘方_第17张图片
漫画算法:判断2的乘方_第18张图片
漫画算法:判断2的乘方_第19张图片
漫画算法:判断2的乘方_第20张图片
漫画算法:判断2的乘方_第21张图片
漫画算法:判断2的乘方_第22张图片
漫画算法:判断2的乘方_第23张图片
漫画算法:判断2的乘方_第24张图片
漫画算法:判断2的乘方_第25张图片
漫画算法:判断2的乘方_第26张图片
漫画算法:判断2的乘方_第27张图片
漫画算法:判断2的乘方_第28张图片
漫画算法:判断2的乘方_第29张图片
漫画算法:判断2的乘方_第30张图片
漫画算法:判断2的乘方_第31张图片
漫画算法:判断2的乘方_第32张图片
解法二:
非常有趣也非常简单的解法。因为2的乘方都符合一个规律,即 N&N-1 等于 0,所以直接用这个规律判断即可。该算法时间复杂度是O(1)。
漫画算法:判断2的乘方_第33张图片
这里写图片描述
漫画算法:判断2的乘方_第34张图片
思考题:
实现一个方法,求出一个正整数转换成二进制后的数字“1”的个数。要求性能尽可能高。
漫画算法:判断2的乘方_第35张图片

哈哈哈,这个思考题挺简单的,我的第一个想法很简单,利用移位运算,在while判断中,如果满足条件则让count++,最后输出即可。第二个想法是利用上面的位运算,每当进行一次上面的位运算,我们总是可以将最右边的1化为0,所以在while中判断,满足条件则count++ 。

代码:
int sum(int n)
{ int count = 0;
while (n != 0)
{
n = n & (n - 1);
count++;
}
}
return count;

有兴趣的读者朋友欢迎留言探讨最优解哦

漫画算法:判断2的乘方_第36张图片

加油啦!

你可能感兴趣的:(编程题)