不借助變數交換兩個數

2021-06-29 04:35:25 字數 994 閱讀 1312

文章:不借助if、switch等語句求兩個數較大的乙個

交換兩個數在排序演算法中用的很多:氣泡排序中 、插入排序中等等。正常的交換兩個數是借助乙個變數tmp:

void swap(int &a, int &b)
在面試題中有這樣的題目「不借助第三個變數,交換兩個數

//a方法

void swap(int &a, int &b)

//b方法

void swap(int &a, int &b)

上述的兩種方式中,a方法缺點:中當數a或b較大時 a = a + b會發生

越界。

方法b的原理:

a = a ^ b;

b = a ^ b; //那麼 b = a ^ b = (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a,即將a賦值給了b

a = a ^ b; //那麼 a = a ^ b = a ^ (a ^ b) = (a ^ a) ^ b = 0 ^ b = b,即實現了將b賦值為a

以上兩種方法的共有bug

當a、b指向的是同乙個數時,即swap(a, a)時,會發生錯誤,將a置為了0。但是a等於b的情況下(即a和b不是指向同乙個位址時)是不會錯誤的。

解決方法:

為swap函式增加判斷語句:當a和b相等的時候不交換。

//a方法

void test(int &a, int &b)

}//b方法

void swap(int &a, int &b) }

使用異或運算 不借助臨時變數交換兩個數

通常交換兩個變數需借助乙個臨時變數,如 int temp temp a a b b temp 使用異或可以不借助臨時變數交換兩個數 a a b b a b a a b 這是用了異或的自反性性質做到的 a b b a 0 a 具體推導過程 第一步 a a b 第二步 b a b a b b a 經過第...

交換a,b(不借助中間變數)

交換a,b 不借助中間變數 1 加減法 該方法可以交換整型和浮點型數值的變數,但在處理浮點型的時候有可能出現精度的損失 a a b b a b a a b 2 異或法 可以完成對整型變數的交換,對於浮點型變數它無法完成交換。a a b b a b a a b 3 乘除法 可以處理整型和浮點型變數,但...

不借助第三個變數交換兩個數值型別變數的值

最簡單的方法是用乙個臨時變數 var a 10,b 20 var temp a a b b temp 讓其中乙個變數變成與a和b都有關係的值 a a b b a b a a b 或者 a a b b a b a b a 利用 位運算a b b a a b c 甚至可以a b a b來完成任務,但是j...