「ALBB面试题」python
【题目】面试
如何判断一个数是否为2的n次方ide
【题目分析】spa
看到这种题,相信你们第一反应就是循环除2,这样作确定是能够得出结果的;可是这种作法无疑大大增长了计算机的运行时间,一个很是大的数字可能会让计算机内存溢出,有没有更好的解决方式呢?有!若是你对数字2敏感,那么必定会想到二进制方法,20=0b一、21=十、22=0b100、23=0b1000......经过找规律发现,只要是2的n次方,它的二进制表示形式中1只有一个。因此本题转换为判断一个数字的二进制形式中1是否只有一个。那么该如何统计呢?3d
方法一:将其转换为字符串,以后统计1的个数code
方法二:再仔细观察,20-1=0、21-1=0b0一、22-1=0b0十一、23-1=0b0111......,获得规律:若是一个数字i为2的n次方,则 i&(i-1)=0 (推荐)blog
【解答】内存
方法一:utf-8
1 #!/Users/minutesheep/.pyenv/shims/python 2 # -*- coding: utf-8 -*- 3 4 5 def isPower(n): 6 ''' 7 判断是否为2的n次方 8 ''' 9 try: 10 n = str(bin(n)) 11 if n.count('1') == 1: 12 return print('是2的n次方') 13 return print('不是2的n次方') 14 except: 15 return print('错误:只接收数字') 16 17 18 if __name__ == '__main__': 19 test_num = 2048 20 isPower(test_num)
是2的n次方
方法二:字符串
1 #!/Users/minutesheep/.pyenv/shims/python 2 # -*- coding: utf-8 -*- 3 4 5 def isPower(n): 6 ''' 7 判断是否为2的n次方 8 ''' 9 try: 10 if n&(n-1) == 0: 11 return print('是2的n次方') 12 return print('不是2的n次方') 13 except: 14 return print('错误:只接收数字') 15 16 17 if __name__ == '__main__': 18 test_num = 2048 19 isPower(test_num)
是2的n次方