今天總結兩個不借助第三個變數實現兩個值的交換的方法:
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中的值就進行了交換。表面上看起來很簡單,但是不容易想到,尤其是在習慣標準演算法之後...