昨天在乙個技術群中,一大堆人討論「兩個數交換,不使用第三個空間」這個問題。當時我給了個答案。
a = a + b;
b = a - b;
a = a - b;
不過後來發現有資料溢位的問題,比如函式void changeab(int a, int b);如果a = int.maxvalue - 10, 30;(int.maxvalue = 2147483647)那麼就會出現資料溢位的問題。雖然說最後兩個數字是互換了,但是總覺得不好,後來我又給了個答案:
a = a ^ b;
b = a ^ b;
a = a ^ b;
結果一些群友沒明白啥意思,當時我建議大家補習一下異或的知識。今天抽空,在這裡給大家補充一下第二種方法的解釋。在解釋之前需要學習一下「^」是什麼。「^」是異或的意思。如果學習過離散相信沒人不知道「異或」吧。我們的計算機是2進製,就是「0」和「1」,那麼01之間的異或關係就是下列樣子:
0 ^ 0 = 0;
0 ^ 1 = 1;
1 ^ 0 = 1;
1 ^ 1 = 0;
知道了異或關係,
a = a ^ b;
b = a ^ b;
a = a ^ b;
就十分好解釋了。
我已10和15為例。比如呼叫void changeab(int a, int b);的語句為:this.changeab(10, 15);其處理步驟為:
1、將10和15轉化成二進位制
00000000000000000000000000001010
00000000000000000000000000001111(第32的0代表是正數)
2、下面我開始翻譯
"a = a ^ b;"為:a = 00000000000000000000000000001010 ^ 00000000000000000000000000001111 = 00000000000000000000000000000101
"b = a ^ b;"為:b = 為:00000000000000000000000000000101 ^ 00000000000000000000000000001111 = 00000000000000000000000000001010
"a = a ^ b;"為:a = 為:00000000000000000000000000000101 ^ 00000000000000000000000000001010 = 00000000000000000000000000001111
所以輸出時:a = 00000000000000000000000000001111 = 15,
b = 00000000000000000000000000001010 = 10。
此式子的優勢是無需考慮正負問題,也無需考慮資料溢位問題。
兩個數交換,不使用第三個空間
昨天在乙個技術群中,一大堆人討論 兩個數交換,不使用第三個空間 這個問題。當時我給了個答案。a a b b a b a a b 不過後來發現有資料溢位的問題,比如函式void changeab int a,int b 如果a int.maxvalue 10,30 int.maxvalue 21474...
不使用第三個變數交換兩個數值。
上班時間,閒來無事,寫個小演算法消遣下。題目來自某.net面試題集錦。相信很多看官也耳熟能詳。也頗為簡單,不會者學,會者繞道。題目如下 不用第三個變數,交換兩個數值。心得 1.時刻注意現在的i,j是最原始的i,j的什麼組合。2.out 原來必須要初始化才能用地。class program j i,j...
交換兩個變數的值,不使用第三個變數
通常我們的做法是 尤其是在學習階段 定義乙個新的變數,借助它完成交換。如下 int a,b a 10 b 15 int t t a a b b t 這種演算法易於理解,特別適合幫助初學者了解電腦程式的特點,是賦值語句的經典應用。在實際軟體開發當中,此演算法簡單明瞭,不會產生歧義,便於程式設計師之間的...