返回

玩转 7 个整数反转算法:LeetCode,思维导图,全解奉上

前端

导言:整数反转之谜

在编程世界中,整数反转是一个经典且实用的问题。它要求我们编写算法,将给定的整数的所有位数颠倒过来。虽然看似简单,但背后的算法却大有乾坤。在这篇文章中,我们将深入探索 7 种独特的整数反转算法,它们将彻底颠覆你的认知。

算法 1:逐位反转

思维导图:

思维导图:逐位反转算法

步骤:

  1. 初始化一个结果变量 res 为 0。
  2. 循环遍历给定整数 num 的每一位,从最右端开始。
  3. 对于每一位 digit,将其乘以 10 并添加到 res 中。
  4. 重复步骤 2 和 3,直到遍历完所有位。
  5. 返回 res

时间复杂度: O(n),其中 n 是给定整数的位数。

空间复杂度: O(1)。

算法 2:递归

思维导图:

思维导图:递归算法

步骤:

  1. 如果给定整数 num 为 0,则返回 0。
  2. 否则,将 num 除以 10,并调用递归函数将结果作为参数。
  3. 返回 num 除以 10 的余数乘以 10 的幂,再加上递归函数的返回值。

时间复杂度: O(n),其中 n 是给定整数的位数。

空间复杂度: O(n),用于递归调用栈。

算法 3:字符串转换

思维导图:

思维导图:字符串转换算法

步骤:

  1. 将给定整数 num 转换为字符串 num_str
  2. 使用字符串反转函数反转 num_str
  3. 将反转后的字符串转换回整数并返回。

时间复杂度: O(n),其中 n 是给定整数的位数。

空间复杂度: O(n),用于存储字符串。

算法 4:除余法

思维导图:

思维导图:除余法算法

步骤:

  1. 初始化一个结果变量 res 为 0。
  2. 循环遍历给定整数 num,不断除以 10 取余。
  3. res 乘以 10 并加上 num 的余数。
  4. 重复步骤 2 和 3,直到 num 为 0。
  5. 返回 res

时间复杂度: O(n),其中 n 是给定整数的位数。

空间复杂度: O(1)。

算法 5:位操作

思维导图:

思维导图:位操作算法

步骤:

  1. 初始化一个结果变量 res 为 0。
  2. 使用位运算符将 num 的最后一位移位到 res 的最高位。
  3. num 右移一位。
  4. 重复步骤 2 和 3,直到 num 为 0。
  5. 返回 res

时间复杂度: O(n),其中 n 是给定整数的位数。

空间复杂度: O(1)。

算法 6:二分法

思维导图:

思维导图:二分法算法

步骤:

  1. 将给定整数 num 转换为字符串 num_str
  2. 使用二分法将 num_str 分成两部分:前半部分和后半部分。
  3. 将两部分反转并拼接成一个新字符串。
  4. 将新字符串转换回整数并返回。

时间复杂度: O(n log n),其中 n 是给定整数的位数。

空间复杂度: O(n),用于存储字符串。

算法 7:栈

思维导图:

思维导图:栈算法

步骤:

  1. 初始化一个栈。
  2. 循环遍历给定整数 num,将每一位压入栈中。
  3. 弹出栈中的所有元素,并依次添加到一个结果变量 res 中。
  4. 返回 res

时间复杂度: O(n),其中 n 是给定整数的位数。

空间复杂度: O(n),用于栈。

比较与选择

这 7 种算法各有优缺点。对于较小的整数,逐位反转算法、除余法算法和位操作算法都是不错的选择。对于较大的整数,递归算法和二分法算法更有效率。字符串转换算法和栈算法更通用,但效率较低。

总结

探索整数反转的奇妙世界,让我们对编程世界有了更深入的了解。从逐位反转到栈操作,每种算法都提供了不同的视角,展现了解决问题的多种方式。掌握这些算法,解锁 LeetCode 难题,提升你的编程技能,成为算法大师!