【面试题】不通过第三个变量,交换两个int的值

【面试题】不通过第三个变量,交换两个int的值

如何不使用第三个变量,交换两个int的值?

曾经面试时被问到这样一个问题:「如何不使用第三个变量,交换两个int的值」。当时很惭愧没有答上来,所以在后来有了答案之后在此记录下来。

答案

这里先上答案:3次异或

public static void main(String[] args) {
	// x,y两个初始变量
	int x = (int) (10 * (Math.random() + 1));
	int y = (int) (10 * (Math.random() + 1));
	System.out.println("x: " + x);
	System.out.println("y: " + y);

	// 交换
	x = x ^ y;
	y = x ^ y;
	x = x ^ y;
	
	System.out.println("x: " + x);
	System.out.println("y: " + y);
}

异或的特性

  1. 归零率:相同数值异或为0
  2. 恒等率:任何数与0异或为这个数本身
  3. 交换律:a 异或 b = b 异或 a
  4. 结合律:a 异或 b 异或 c = (a 异或 b) 异或 c = a 异或 (b 异或 c)
  5. 自反:a 异或 b 异或 a = b
  6. 相同为0,不同为1

题解

这里借助异或的结合律、归零率和恒等率

第一次异或:
x = x ^ y;
可以看做是:x1 = x ^ y;

第二次异或:
y = x ^ y;
可以看做是:y = x1 ^ y = x ^ y ^ y = x;
此时现在的y的值为初始状态的x的值

第三次异或:
x = x ^ y;
可以看做是:x = x1 ^ y = x1 ^ x = x ^ y ^ x = y;
此时,x的值为初始状态y的值,交换完成。

通过三次异或,实现不借助第三个变量交换两个int的值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

future_1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值