1. 程式人生 > >不佔用任何額外空間的情況下交換兩個數的值

不佔用任何額外空間的情況下交換兩個數的值

題目

假如有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原本的值。

這種方法很巧妙,也不太好理解,但是不存在溢位的情況。