华为机试-求最大连续bit数

题目:

描述

求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1

本题含有多组样例输入。

输入描述:

输入一个byte数字

输出描述:

输出转成二进制之后连续1的个数

示例1

输入:

3
5

输出:

2
1

说明:

3的二进制表示是11,最多有2个连续的1。
5的二进制表示是101,最多只有1个连续的1。 

给的提示是位运算,自己写的思路就是位运算所以分享一下,并附两个其他人的思路

法1(自己写的):

思路:从后往前对每一段连续的1计数,遇0清空计数并存档,下次遇到连续次数更多的就更新存档

while True:
    try:
        n = int(input())
        count = 0
        res = 0
        while n:
            count += n&1
            n >>= 1
            if not n&1:
                if count > res:
                    res = count
                count = 0
        print(res)
    except:
        break

法2:

思路:从1个1开始找,一直到几个1不在字符串内,那这个“几个”就是连续1的个数

while True:
    try:
        res, a = 0, bin(int(input())).replace("0b", "")
        for i in range(1, len(a) + 1):
            if "1" * i in a:
                res = i
            else:
                break
        print(res)
    except:
        break

法3:

思路:用字符串分割的方法,用'0'分割出形如['11','1','1','111']的列表,找列表中长度最大的

while True:
    try:
        n = int(input())
        m = str(bin(n)[2:])
        l = m.split('0')
        num = 0
        for i in l:
            num = max(num, len(i))
        print(num)
    except:
        break

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值