大資料Java 交換變數的3種方式

2021-07-11 08:04:04 字數 2524 閱讀 4148

本話題要討論的是一道面試題目:交換兩個變數的值。兩個變數而已,看似再簡單不過了,不過一道簡單的題目可以使用多種方式來完成, 其中有比較普通的實現, 也有相對高明的實現,雖然是一道簡單的題目,但是通過面試者對該題目的認知能力,就可以看出面試者的水平。

重點摘要:

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...