码迷,mamicode.com
首页 > 其他好文 > 详细

不占用任何额外空间的情况下交换两个数的值

时间:2018-12-23 00:15:31      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:实现   利用   个数   异或   int   如何   异或运算   不能   中间   

题目

假如有x、y两个数,如何在不占用任何额外空间的情况下交换两个数的值?

思路

平时我们在交换两个数的值时,往往会用一个中间数temp来实现效果,现在需要不占用任何额外空间,自然就不能使用这种寻常的方法了;这里可以有两种方法来实现。

方法一

int x = 5;
int y = 10;
x = x + y;
y = x - y;
x = x - y;

先将两个数之和附给x,接着x-y自然就是原本x的值,这时候赋值给y,y就拿到了x原本的值。此时x依然是两个数之和,再进行x-y自然就是原本x的值。

这种方法比较直观,也好理解,但是可能存在溢出的情况。

方法二

int x = 5;
int y = 10;
x = x ^ y;
y = x ^ y;
x = x ^ y;

第二种方法利用了异或运算的性质:

  • 相同的两个数异或结果为0
  • 任何数与0异或结果还是其自身
  • 异或运算满足交换律和结合律

于是将x^y的结果赋予x,接着再将x与y异或,此时y的值就是x^y^y = x^(y^y) = x,也就是说y拿到了x原本的值。
此时x依然是两数异或的结果,而y是x原本的值,接着进行x^y就等同于x^y^x = y, 于是x就拿到了y原本的值。

这种方法很巧妙,也不太好理解,但是不存在溢出的情况。

不占用任何额外空间的情况下交换两个数的值

标签:实现   利用   个数   异或   int   如何   异或运算   不能   中间   

原文地址:https://www.cnblogs.com/yulinlewis/p/10162819.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!