返回
剑指Offer15:二进制中1的个数
前端
2024-02-03 17:45:09
前言
算法,对前端人来说陌生又熟悉,很多时候我们都不会像后端工程师一样重视这项能力。但事实上,算法对每一个程序员来说,都有着不可撼动的地位。因为开发的过程就是把实际问题转换成计算机可识别的指令,而算法则是将这些指令按照一定的逻辑顺序排列,从而实现特定功能。
问题
在《剑指Offer》第二版中,第15题是“二进制中1的个数”,其如下:
给定一个整数
n
,返回其二进制表示中 1 的个数。
例如:
- 当
n
为 5 时,二进制表示为 “101”,其中 1 的个数为 2。 - 当
n
为 11 时,二进制表示为 “1011”,其中 1 的个数为 3。
解法
解决此问题的方法有很多,但最简单的方法之一是使用循环。我们可以逐位检查 n
的二进制表示,并计算其中 1 的个数。
以下是使用循环的Python代码实现:
def count_ones(n):
"""
计算整数二进制表示中 1 的个数
参数:
n: 给定的整数
返回:
整数二进制表示中 1 的个数
"""
count = 0
while n > 0:
if n % 2 == 1:
count += 1
n //= 2
return count
# 测试代码
print(count_ones(5)) # 输出:2
print(count_ones(11)) # 输出:3
print(count_ones(1024)) # 输出:1
优化
上述代码虽然简单易懂,但存在一定的性能问题,尤其是当 n
的值非常大的时候。为了提高性能,我们可以使用位运算来解决此问题。
以下是使用位运算的Python代码实现:
def count_ones(n):
"""
计算整数二进制表示中 1 的个数
参数:
n: 给定的整数
返回:
整数二进制表示中 1 的个数
"""
count = 0
while n > 0:
count += n & 1
n >>= 1
return count
# 测试代码
print(count_ones(5)) # 输出:2
print(count_ones(11)) # 输出:3
print(count_ones(1024)) # 输出:1
使用位运算的好处在于,它可以将原本需要多次循环才能完成的操作,简化为一个简单的位运算操作。这使得代码更加简洁,并且提高了性能。
总结
在本文中,我们介绍了两种计算整数二进制表示中 1 的个数的方法。第一种方法是使用循环逐位检查,第二种方法是使用位运算。
使用循环的方法虽然简单易懂,但存在一定的性能问题。而使用位运算的方法虽然更加复杂,但性能更高。
在实际应用中,我们可以根据具体情况选择使用哪种方法。如果 n
的值很小,那么使用循环的方法即可。如果 n
的值很大,那么使用位运算的方法更加合适。