本話題要討論的是一道面試題目:交換兩個變數的值。兩個變數而已,看似再簡單不過了,不過一道簡單的題目可以使用多種方式來完成, 其中有比較普通的實現, 也有相對高明的實現,雖然是一道簡單的題目,但是通過面試者對該題目的認知能力,就可以看出面試者的水平。
重點摘要:
1 通過中間變數交換。
2 通過求和與求差交換。
3 通過異或交換。
通過第 3 個變數
首先,我們給出最簡單的方式。
【例】 交換兩個變數的值。
1.package chapter2;
2.3.
public
class swap
15.//無效的交換
16.public
static
void
swap(int x, int y)
21.//有效的交換
22.public
static
void
swap(value value)
27.}
28.29.class value
37.}
程式執行結果如下:
5
1010
5
這個程式同時給出了有效的交換(第 22~26 行)與無效的交換(第 16~20 行)。因為形參的改變是無法反作用於實參的,所以不能使用變數交換的方式,而是要使用通過引用來修改其成員變數的方式。這就類似與 c / c++的語言中的指標效果。
通過相加的方式
通過第 3個臨時變數,可以成功交換兩個變數的值,不過,有時,面試題目的要求會比較苛刻,就是不允許借助於臨時變數。這樣,就有些複雜了。
【例】 交換兩個變數的值2。
1.package chapter2;
2.3. public class swap2
21.22. public static void swap(value v)
27.}
程式執行結果如下:
v1的交換結果:
10
5
v2的交換結果:
1500000000
1200000000
v3的交換結果:
-1500000000
-1200000000
核心部分就是 swap 方法(第 22~26 行),該方法的 3 條語句解釋為:
v.x = v.x + v.y
; //將v.x與v.y的和儲存在v.x中
v.y = v.x - v.y
; – v.y的值就是以前v.x的值,賦值給v.y
v.x = v.x -v.y
; – v.y的值就是以前v.y的值,賦值給v.x
這樣,沒有通過臨時變數,也同樣交換了兩個變數的值。也許上面的方法一時不太容易理解,那麼可以這樣考慮:
int z = v.x + v.y
;v.y = z – v.y
;v.x = z - v.y
;
只不過這裡使用另外乙個變數 z,而上面使用 v.x 來儲存 v.x 與 v.y 的和,但是交換的效果是相同的。
注意程式的第 10 行與第 15 行, v.x 與 v.y 的初始值非常大(小),這樣一來,當執行swap方法時(以第 10 行為例):
v.x = v.x + v.y
;
十六進製制求和如下所示:
47868c00( v.x)
+ 59682f00( v.y)
結果: a0eebb00( v.x + v.y)
注意這個結果的最高位為 1,結果為負數(十進位制值為−1594967296,也就是 v.x 與 v.y 的和已經超過了 int 型別的最大(小)值,發生溢位。
執行接下來的語句:
v.y = v.x - v.y
;
這個計算就是使用溢位後的值−1594967296 減去 v.y( 1500000000),從 int 型別的求差角度來說,結果再一次溢位了,十六進製制求差如下所示:
a0eebb00( v.x + v.y)
− 59682f00( v.y)
結果: 47868c00(結果 v.y)
經過兩次溢位以後,又再次得出了我們期望的值。同樣, swap 方法的第 3 條語句:
v.x = v.x -v.y
;
a0eebb00( v.x + v.y)
− 47868c00( v.y)
結果: 59682f00(結果 v.x)
也是發生了溢位,不過最後的差值也得出了期望的結果。可以看出,當兩個數之和很大(小)時,雖然發生了溢位,不過最後還是陰差陽錯地得到了正確的結果。儘管結果正確,這種相加的方式還不算十分可取。
(未完待續)
交換函式的3種實現 Java實現》
交換兩個元素的三種方法 author sking package function public class swaputil 使用加減法交換兩個元素 元素型別必須支援加減運算 param x 第乙個元素 param y 第二個元素 public static void swap1 int x,in...
Java演算法 交換兩個變數的值,3種方法
1 借助中間量交換 開發常用 int x 10 int y 20 int temp x x y y temp 此種方法可以將中間量看成空杯,即把temp看成是空杯,把x看成是裝有白酒的杯子,把y看成是裝有紅酒的杯子 int temp x 把白酒倒到空杯中,此時temp裝有白酒,x變成空杯 x y 把...
話題15 異曲同工 交換變數的3種方式
下面介紹2個變數交換的3種方式。見 package huati15 author vayne public class swaptest param va private static void swap value va param i param j private static void sw...