力扣题库231题“2的幂”问题的非常规思考及解决

231. 2 的幂

难度:简单

问题描述:

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。

如果存在一个整数 x 使得 n == 2**x ,则认为 n 是 2 的幂次方。

示例 1:

输入:n = 1

输出:true

解释:2**0 = 1

示例 2:

输入:n = 16

输出:true

解释:2**4 = 16

示例 3:

输入:n = 3

输出:false

示例 4:

输入:n = 4

输出:true

示例 5:

输入:n = 5

输出:false

进阶:你能够不使用循环/递归解决此问题吗?

这个题虽说难度为简单,但如果按进阶要求解决,就比较有意思了。

分析:

我们知道:一个整数如果是2的幂,则这个整数除以2,余数为零,将商继续除以2,余数还是为零,再将商除以2,如此反复处理,最后肯定是商1余数为0。因此我们构建循环进行这样的处理,如果每一步的余数为0且最终商为1,则说明这个整数是2的幂,否则不是,但如果这样处理就落入俗套了,那进阶解法是如何不使用循环或递归来解决问题呢?

大家不要忘记计算机是以二进制为基础的,二进制数的特点对于解决这个问题具有天然的优势。

先通过列举了解一下,注意列举式依次是:2**指数 = 十进制形式 ——> 二进制形式

2**0=1 ——>  1

2**1=2 ——>  10

2**2=4 ——>  100

2**3=8 ——>  1000

2**4=16 ——>10000

......

可以看出:一个整数如果是2的幂,其二进制形式只包含一个1,其它都是0,根据这样一个特点,我们的程序就很好设计了。

程序如下:

#对输入的整数x进行判断,如果是2的幂,返回True,否则返回False
def pd(x):
    y=bin(x)[2:]
    if y.count('1')==1:
        return True
    else:
        return False

#输入整数n,并输出n是否是2的幂
n=int(input('pls input n='))
print(pd(n))

运行实例1:

pls input n=15

False

运行实例2:

pls input n=256

True

运行实例3:

pls input n=1024

True

运行实例4:

pls input n=1022

False

解决问题一般我们是按照常规的思路去进行,常规思路是大众化的解决方案,有时会有使蛮力的感觉,费力不讨好,但这种常规思维可以让人炼出扎实的基本功,而非常规思路解决问题会让人有投机取巧的感觉,但往往事半功倍,因而具有很明显的优势,给问题的解决带来极大的方便。常规思维是主流,80-90%的问题都要用常规思维去解决,但偶尔投机取巧一下,不也是很美妙的事情吗?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值