【面试】解释C++中如何不用中间变量交换两个数

面试模拟场景

面试官: 你能解释一下在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 的值。

注意事项:

  • 如果 ab 的和超出了数据类型的范围(如整数溢出),可能会导致错误。因此,这种方法在处理非常大的数时需要谨慎。

2. 使用异或运算交换两个数

基本原理:

  • 异或运算(^)具有一个重要的性质:对于任意整数 x,有 x ^ x = 0x ^ 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; 计算 ab 的异或结果,并将结果存储在 a 中。
  • 第二行 b = a ^ b; 将新的 a 值(即 a ^ b)与 b 进行异或,结果是原来的 a,因此 b 现在存储原来的 a
  • 第三行 a = a ^ b; 再次将新的 a 值(即 a ^ b)与新的 b(即原来的 a)进行异或,结果是原来的 b,因此 a 现在存储原来的 b

优点:

  • 使用异或运算不会发生溢出问题,因为它只涉及位操作。
  • 这种方法在位操作层面更具效率,且适用于所有整数类型。

3. 总结

  • 加减法交换: 通过加减法的操作交换两个数,不使用中间变量,但要注意可能的溢出问题。
  • 异或运算交换: 通过异或运算交换两个数,这种方法不会有溢出问题,且适用于所有整数类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值