返回

剑指Offer15:二进制中1的个数

前端

前言

算法,对前端人来说陌生又熟悉,很多时候我们都不会像后端工程师一样重视这项能力。但事实上,算法对每一个程序员来说,都有着不可撼动的地位。因为开发的过程就是把实际问题转换成计算机可识别的指令,而算法则是将这些指令按照一定的逻辑顺序排列,从而实现特定功能。

问题

在《剑指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 的值很大,那么使用位运算的方法更加合适。