面试模拟场景
面试官: 你能解释一下在C++中如何不用中间变量交换两个数吗?
参考回答示例
1. 使用加减法交换两个数
基本原理:
- 通过加减法,我们可以利用两个数的和来进行交换,不需要额外的存储空间。
实现代码:
int a = 5;
int b = 10;
a = a + b; // a 变为 a + b,即 a = 15
b = a - b; // b 变为 (a + b) - b,即 b = 5(原来的 a 的值)
a = a - b; // a 变为 (a + b) - a,即 a = 10(原来的 b 的值)
解释:
- 第一行
a = a + b;
将a
的值变为两个数的和。 - 第二行
b = a - b;
利用新的a
值减去b
,使b
得到原来a
的值。 - 第三行
a = a - b;
再次利用新的a
值减去现在的b
,使a
得到原来b
的值。
注意事项:
- 如果
a
和b
的和超出了数据类型的范围(如整数溢出),可能会导致错误。因此,这种方法在处理非常大的数时需要谨慎。
2. 使用异或运算交换两个数
基本原理:
- 异或运算(
^
)具有一个重要的性质:对于任意整数x
,有x ^ x = 0
和x ^ 0 = x
。利用这一性质,可以在不使用中间变量的情况下交换两个数。
实现代码:
int a = 5;
int b = 10;
a = a ^ b; // a 变为 a ^ b
b = a ^ b; // b 变为 (a ^ b) ^ b,即 a
a = a ^ b; // a 变为 (a ^ b) ^ a,即 b
解释:
- 第一行
a = a ^ b;
计算a
和b
的异或结果,并将结果存储在a
中。 - 第二行
b = a ^ b;
将新的a
值(即a ^ b
)与b
进行异或,结果是原来的a
,因此b
现在存储原来的a
。 - 第三行
a = a ^ b;
再次将新的a
值(即a ^ b
)与新的b
(即原来的a
)进行异或,结果是原来的b
,因此a
现在存储原来的b
。
优点:
- 使用异或运算不会发生溢出问题,因为它只涉及位操作。
- 这种方法在位操作层面更具效率,且适用于所有整数类型。
3. 总结
- 加减法交换: 通过加减法的操作交换两个数,不使用中间变量,但要注意可能的溢出问题。
- 异或运算交换: 通过异或运算交换两个数,这种方法不会有溢出问题,且适用于所有整数类型。