實現兩個值的交換(不借助第三個變數)

2021-10-04 04:47:31 字數 1447 閱讀 7574

今天總結兩個不借助第三個變數實現兩個值的交換的方法:

int

main()

int

main()

今天主要聊聊第乙個方法,因為可讀性較強,並且聽一些老師說,這個方法也被很多網際網路公司作為面試題,但其實這個方法是有bug的,隱藏的很深,我們來分析分析。

#include

void

swap_1

(int

*a,int

*b)//不借助第三個變數實現的交換函式

void

show

(int

*arr,

int len)

//列印輸出陣列函式

printf

("\n");

}void

reverse

(int

*c,int len)

//逆置陣列函式

}int

main()

;//定義並賦初值乙個長度為奇數的陣列

show

(brr,

sizeof

(brr)

/sizeof

(brr[0]

));reverse

(brr,

sizeof

(brr)

/sizeof

(brr[0]

));show

(brr,

sizeof

(brr)

/sizeof

(brr[0]

));return0;

}

這個程式很簡單,首先定義了乙個長度為奇數的陣列並賦予初值,接著呼叫逆置函式,將陣列元素逆置,最後通過列印輸出函式,將陣列元素依次輸出。我們來看看結果:

乍一看,結果好像是正確的,實際上仔細觀察,會發現最中間的數6變為了0,這個bug隱藏的很深,我們很難發現,我們再來除錯找找原因:

接著再相減:

此時對應brr[5]的值就被修改為了0。

綜上:我們得出結論,不借用第三個變數達到交換的函式,如果是用先相加,在相減,再相減的方法時,存在乙個不易被發現的bug:若整體陣列長度為奇數,則交換函式交換到最中間的時候,會使中間值變為0。從而使得資料錯誤。

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

通常我們的做法是 尤其是在學習階段 定義乙個新的變數,借助它完成交換。如下 int a,b a 10 b 15 int t t a a b b t 這種演算法易於理解,特別適合幫助初學者了解電腦程式的特點,是賦值語句的經典應用。在實際軟體開發當中,此演算法簡單明瞭,不會產生歧義,便於程式設計師之間的...

JAVA不借助第三個變數實現兩個變數交換的思考

package mypackage public class demo 方法1 public void xchan01 int a,int b 方法2 public void xchan02 int a,int b 方法3 兩數交換不一定需要第三個元素 演算法問題 巧妙交換,提出的缺點會溢位經測驗是...

不借助第三個變數實現兩個變數交換的思考

網上存在三種方法 1 算術運算 簡單來說,就是通過 和 運算來實現。如下 int a,b a 10 b 12 a b a a 2 b 12b b a a 2 b 10a b a a 12 b 10 通過以上運算,a和b中的值就進行了交換。表面上看起來很簡單,但是不容易想到,尤其是在習慣標準演算法之後...