题目难度: 中等
今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~
题目描述
编写一个函数,不用临时变量,直接交换 numbers = [a, b]中 a 与 b 的值。
示例:
- 输入: numbers = [1,2]
- 输出: [2,1]
提示:
- numbers.length == 2
- -2147483647 <= numbers[i] <= 2147483647
题目思考
- 使用哪些运算可以做到原地交换?
解决方案
思路
- 分析题目, 要想不用临时变量, 我们必须原地更新
- 这时候可以将第一个下标用来存储中间值, 然后另一个下标通过该中间值计算得出交换后的值, 最后再将两者进行计算, 得到第一个下标交换后的值即可
- 而异或操作具有这样的性质:
a^b^a = a
, 很适合这里存储中间值的过程 - 具体做法如下 (假设初始值为
[a, b]
):
- 第一步:
a^=b => [a^b, b]
- 第二步:
b^=a => [a^b, b^a^b] => [a^b, a]
- 第三步:
a^=b => [a^b^a, a] => [b, a]
- 通过以上三步, 即成功交换了 a 和 b 的值
复杂度
- 时间复杂度
O(1)
: 只进行了三次异或操作 - 空间复杂度
O(1)
: 没有使用额外变量
代码
class Solution:
def swapNumbers(self, numbers: List[int]) -> List[int]:
numbers[0] ^= numbers[1]
numbers[1] ^= numbers[0]
numbers[0] ^= numbers[1]
return numbers
大家可以在下面这些地方找到我~😊
我的公众号: 算法精选, 欢迎大家扫码关注~😊