1. 不用第三变量交换两个数的背景与价值
在编程面试和算法基础考核中,"交换两个变量的值"是一个经典得不能再经典的题目了。大多数初学者第一反应就是通过临时变量实现交换,这当然没错,但面试官紧接着就会追问:"如果不允许使用第三个变量,你能实现交换吗?" 这个问题看似简单,却暗藏玄机,考察的是对计算机底层运算原理的理解。
2024年这个时间节点特别标注出来,是因为随着编译器优化技术的进步,这类"炫技式"的交换方法在实际工程中已经不再推荐使用。但理解其背后的数学原理和位运算逻辑,仍然是每个合格程序员应该掌握的基本功。我在技术面试中担任考官时,依然会把这个问题作为考察候选人基本功的试金石。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基于算术运算的交换方法
2.1 加减法实现交换
最直观的不用临时变量的交换方法就是利用加减法:
python复制a = 5
b = 3
a = a + b # a=8, b=3
b = a - b # a=8, b=5
a = a - b # a=3, b=5
这个方法看似巧妙,但存在两个潜在问题:
- 数值溢出风险:当a和b都是大整数时,a+b可能超出整数类型的最大值
- 仅适用于数值类型:对于非数值类型的对象(如字符串、自定义类)无法使用
我在实际代码审查中就遇到过因为使用这种方法导致整数溢出的生产事故。一个电商系统在统计销量时,两个int类型的销量值交换时发生了溢出,最终导致数据显示异常。
2.2 乘除法实现交换
类似地,我们也可以用乘除法来实现交换:
python复制a = 5
b = 3
a = a * b # a=15, b=3
b = a / b # a=15, b=5
a = a / b # a=3, b=5
这种方法的问题更加明显:
- 除零风险:当b初始为0时会导致除零异常
- 精度损失:对于整数除法会丢失精度
- 溢出风险比加减法更大
3. 基于位运算的XOR交换法
3.1 经典XOR交换算法
最优雅的不用临时变量的交换方法是使用异或(XOR)位运算:
python复制a = 5 # 二进制 0101
b = 3 # 二进制 0011
a = a ^ b # a=0110(6), b=0011(3)
b = a ^ b
