返回

LeetCode:破解 2 的幂次方之谜,技巧满载!

IOS

前言

在计算机编程的世界中,算法和数据结构是我们不可或缺的利器。LeetCode 作为一道著名的算法题库,吸引了无数程序员前来挑战。其中一道经典题目——判断一个整数是否为 2 的幂次方——看似简单,却暗藏玄机。本文将带领你深入理解这个问题,并分享使用 Swift 语言的高效解法。

2 的幂次方的本质

2 的幂次方是指可以表示为 $2^n(其中 n 为非负整数)的整数。例如,4 是 2 的平方($2^2),8 是 2 的立方($2^3$)。换句话说,2 的幂次方是只有 1 个 2 因子的整数。

Swift 解法

在 Swift 中,判断一个整数是否为 2 的幂次方有多种方法。这里介绍两种最常见的解法:

方法 1:二进制位运算

使用二进制位运算符 &(按位与)可以巧妙地解决这个问题。对于 2 的幂次方,它的二进制表示中只有一个 1,其余都是 0。例如,8 的二进制表示为 1000,而 9 的二进制表示为 1001。通过与 8-1(二进制表示为 0111)进行按位与运算,可以得到 0000,这意味着 9 不是 2 的幂次方。

func isPowerOfTwo(_ n: Int) -> Bool {
  return n > 0 && (n & (n - 1)) == 0
}

方法 2:对数运算

利用对数的性质,也可以判断一个整数是否为 2 的幂次方。对于任何正整数 x,如果 log2(x) 是整数,那么 x 就是 2 的幂次方。

func isPowerOfTwo(_ n: Int) -> Bool {
  return n > 0 && log2(Double(n)) == floor(log2(Double(n)))
}

性能比较

两种方法的性能差异很小,一般情况下二进制位运算方法略胜一筹。但是,对于较大的整数,对数运算方法的性能会更优。

拓展:位运算技巧

除了判断 2 的幂次方之外,位运算在算法中还有广泛的应用。这里分享两个常见的技巧:

  • 检查奇偶性: n & 1 等于 1 表示 n 为奇数,等于 0 表示 n 为偶数。
  • 提取最低位: n & (-n) 等于 n 的二进制表示中的最低位(即最右侧的 1)。

总结

判断一个整数是否为 2 的幂次方是 LeetCode 中一道经典题目,可以使用二进制位运算或对数运算的方法解决。掌握这些技巧不仅可以帮你轻松通过算法面试,还能提升你对计算机底层原理的理解。

结语

LeetCode 题目的魅力在于它不断激发我们的思考和探索,帮助我们提升编程能力。希望本文能为你攻克 LeetCode 算法挑战之路添砖加瓦。让我们携手共进,在算法的世界中不断成长!