给定一个非负数n和两个值l和r 。问题在于,以n的二进制表示形式对范围在l到r之间的设置位数进行计数,即,对从最右边的第l位到最右边的第r位的设置位进行计数。
约束: 1 <= l <= r <= n的二进制表示形式的位数。
例子:
Input : n = 42, l = 2, r = 5
Output : 2
(42)10 = (101010)2
There are '2' set bits in the range 2 to 5.
Input : n = 79, l = 1, r = 4
Output : 4
我们已有解决此问题的方法,请参阅范围链接中的计数设置位。我们可以在Python快速解决此问题。办法很简单,
- 使用bin(num)函数将十进制转换为二进制。
- 现在删除输出二进制字符串的前两个字符,因为默认情况下bin函数将’0b’作为前缀附加在输出字符串。
- 对从索引(l-1)开始到索引r的字符串切片并将其反转,然后对介于两者之间的设置位进行计数。
# Function to count set bits in a range
def countSetBits(n,l,r):
# convert n into it's binary
binary = bin(n)
# remove first two characters
binary = binary[2:]
# reverse string
binary = binary[-1::-1]
# count all set bit '1' starting from index l-1
# to r, where r is exclusive
print (len([binary[i] for i in range(l-1,r) if binary[i]=='1']))
# Driver program
if __name__ == "__main__":
n=42
l=2
r=5
countSetBits(n,l,r)
输出:
2