1. 问题背景与核心需求
这道来自力扣(LeetCode)的面试题看似简单,却蕴含着计算机科学中关于变量操作和内存管理的底层原理。题目要求编写一个函数,不使用临时变量完成两个数字的交换。在实际工程中,这种需求常出现在内存严格受限的嵌入式系统开发,或是算法竞赛中对代码简洁性的极致追求场景。
传统交换方式需要第三个临时变量(temp),但本题的限制条件迫使我们寻找更巧妙的数学或位运算解法。这类问题在Google、Facebook等顶级科技公司的面试中频繁出现,主要考察候选人对基础操作的深入理解和创造性思维能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数学解法:加减法交换
2.1 算法原理
利用算术运算的特性,通过连续的加减操作实现值传递:
python复制def swapNumbers(a, b):
a = a + b # 步骤1:将两数之和存入a
b = a - b # 步骤2:此时a是原始a+b,减去b得到原始a,存入b
a = a - b # 步骤3:a当前仍是原始a+b,减去新的b(原始a)得到原始b
return [a, b]
2.2 数学验证
假设初始值a=5, b=3:
- a = 5 + 3 = 8
- b = 8 - 3 = 5(原始a值)
- a = 8 - 5 = 3(原始b值)
2.3 潜在风险与注意事项
重要警示:此方法在数值极大时可能发生整数溢出。例如在32位系统中,当a+b超过2147483647时会导致意外结果。实际工程中应严格评估数值范围。
3. 位运算解法:异或交换
3.1 异或运算特性
异或(XOR)操作具有以下关键性质:
- 自反性:a ^ a = 0
- 恒等性:a ^ 0 = a
- 交换律:a ^ b = b ^ a
- 结合律:(a ^ b) ^ c = a ^ (b ^ c)
3.2 算法实现
python复制def swapNumbers(a, b):
a = a ^ b # 步骤1:得到a和b的差异位掩码
b = a ^ b # 步骤2:用掩码与b异或还原出原始a
a = a ^ b # 步骤3:用掩码与新b异或还原出原始b
return [a, b]
