返回

揭秘 Swift 中 LeetCode:轻松计算二进制位计数

IOS

引言

在计算机科学领域,位操作是一种强大的技术,用于在二进制级别操纵数据。它在许多应用程序中发挥着至关重要的作用,包括算法、加密和数据压缩。LeetCode 是一个流行的在线平台,提供一系列编程挑战来磨练你的技能。本文将重点介绍 LeetCode 上的“二进制位计数”问题,并展示如何在 Swift 中使用位操作巧妙地解决它。

问题

给定一个非负整数 n,目标是计算从 0 到 n 的所有整数的二进制表示中 1 的个数。例如,对于 n = 5,二进制位计数为 [0, 1, 1, 2, 1, 2],因为:

  • 0 的二进制表示为 0,没有 1。
  • 1 的二进制表示为 1,有 1 个 1。
  • 2 的二进制表示为 10,有 1 个 1。
  • 3 的二进制表示为 11,有 2 个 1。
  • 4 的二进制表示为 100,有 1 个 1。
  • 5 的二进制表示为 101,有 2 个 1。

位操作解决方案

解决“二进制位计数”问题的关键在于理解位操作的几个基本操作:

  • 按位与(&): 将两个二进制数字按位相与,结果为 1 仅当两个对应的位都为 1 时。
  • 按位或(|): 将两个二进制数字按位相或,结果为 0 仅当两个对应的位都为 0 时。
  • 右移(>>): 将二进制数字向右移动 n 位,相当于将数字除以 2^n。

使用这些操作,我们可以设计一个算法来计算二进制位计数:

  1. 初始化一个计数器变量为 0。
  2. 遍历从 0 到 n 的所有整数 i。
  3. 对于每个 i,重复以下步骤,直到 i 为 0:
    • 将 i 与 1 按位与(&),结果存储在变量 lowbit 中。
    • 将 i 右移 1 位(>>)。
    • 将 lowbit 与计数器相加。
  4. 返回计数器。

Swift 实现

在 Swift 中,我们可以利用其强大的位操作功能来简洁高效地实现上述算法:

func countBits(_ n: Int) -> [Int] {
    var count = Array(repeating: 0, count: n + 1)
    for i in 0...n {
        var lowbit = i & 1
        var num = i >> 1
        while num > 0 {
            lowbit += num & 1
            num >>= 1
        }
        count[i] = lowbit
    }
    return count
}

分析

该 Swift 实现与上述算法一致。它使用按位与 (&)、右移 (>>) 和相加 (+) 来计算每个整数的二进制位计数。该算法的时间复杂度为 O(n log n),其中 n 是给定的整数。

结论

通过本文,我们深入探讨了“二进制位计数”问题,并展示了如何在 Swift 中使用位操作技术有效地解决它。通过了解位操作的基本原则和巧妙地应用算法,我们能够在 LeetCode 上解决复杂的问题并提高我们的编程技能。继续探索位操作的强大功能,并在未来的编码挑战中取得成功!