不用臨時變量怎么實現(xiàn) swap(a, b)

看了很多方法,因人而已。
兩個int型變量a和b,不使用臨時變量,交換它們的值。
總結(jié)一下:
C
a = a + b;
b = a;
a = a - b;

Python
a , b = b , a

應(yīng)該是C++
a = a ^ b;
b = a ^ b;
a = a ^ b;
然后截取一段大神的文章:http://blog.csdn.net/caozhk/article/details/20175441
就地交換兩個數(shù)是比較經(jīng)典而且基礎(chǔ)的算法之一。 我們要交換兩個數(shù)字,通常的做法就創(chuàng)建一個中間變量,然后進(jìn)行循環(huán)賦值,比如說下面的代碼:
void Switch(int* p1, int* p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}

這種做法是最常見的一種交換兩個數(shù)字的方法,但研究算法的人總是會提出比較詭異的問題,比如說在手持設(shè)備中,內(nèi)存資源很寶貴,要求不開辟新的空間,就地完成交換工作。

我們來考慮一下,如果想要就地完成這個交換的工作,從哲學(xué)地角度思考這個問題,我們手頭有兩個變量,要存儲兩個的信息。我們將每個信息存儲到一個單獨(dú)的變量中,這是一種存儲方式,但如果使用這種存儲方式,我們是不可能完成就地交換的。那么我們需要考慮另外一種存儲方式,用一個變量存儲兩個信息的集合,用另外一個變量存儲任意一個信息,這種存儲方式就可以完成交換的工作。

上面這段話很抽象,我們用為代碼來表示

// 現(xiàn)在有兩個變量a, b,我使得
a = [a,b] // a 等于ab兩個信息的集合
b = b // b 還是 b

這種表示方法,我們存儲了兩個信息,但存儲方式不一樣,我們需要對信息進(jìn)行提取,例如我們要a時,則
c = a 去除 b

如果還是不明白這種存儲方式,那么我直接給出就地交換的算法:

void switch(int* p1, int* p2)
{
*p1 = *p1 + p2; // 改變存儲方式,使得p1保存兩個信息
*p2 = *p1 - *p2; // 取出 原來的 *p1 信息,存入 *p2 中
*p1 = *p1 - *p2; // 取出原來的 *p2 信息,存入 *p1 中
}

上面的代碼看起來有點煩? 把指針去掉看吧:

int a = 1;
int b = 2;
a = a + b;
b = a - b;
a = a - b;

這個思路很巧妙,但也存在一定問題: 萬一溢出了怎么辦?

到目前為止,我們的答題思路是沒錯的,就是尋找另外一種數(shù)據(jù)存儲的模式,用一個變量保存兩條信息的集合,我們?nèi)匀恍枰捎眠@種模式解決這個問題,但原先的簡單相加的模式是不行了,于是我們想到,集合兩個整型數(shù)字,是否可以從其二進(jìn)制表達(dá)方面來考慮?

我們可以使用位異或來存儲集合信息。 用 1 和 0 來做簡單的驗證,看是否可以用異或的方式,存儲信息的集合:
如果兩個數(shù)是a = 1和b = 0,則:
集合 = 1
0 異或 集合 = 1
1 異或 集合 = 0

如果 a = 1 & b = 1
集合 = 0
1 異或 集合 = 1

如果 a = 0 & b = 0
集合 = 0
0 疑惑 集合 = 0

驗證結(jié)果: 可以采用信息集合的方式存儲

那么我們的交換代碼可以變成:

int a = 10;
int b = 50;

a = a ^ b; // 構(gòu)建集合
b = a ^ b; // 取出集合的另一個元素
a = a ^ b; // 取出集合的另一個元素

這種方式不用擔(dān)心數(shù)據(jù)溢出,應(yīng)該算是就地交換兩個數(shù)的最佳解決方案了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,839評論 18 399
  • 第1章 第一個C程序第2章 C語言基礎(chǔ)第3章 變量和數(shù)據(jù)類型第4章 順序結(jié)構(gòu)程序設(shè)計第5章 條件結(jié)構(gòu)程序設(shè)計第6章...
    小獅子365閱讀 10,890評論 3 71
  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,619評論 3 44
  • 今天去馬達(dá)單位咯 是驚喜的午餐約飯 然后愉快的下午電影時光 兩個人一起的值班 真是什么工作的干不了 喝咖啡 吃哈密...
    ninvxv閱讀 216評論 0 0
  • 似錦華年水樣流 驚醒殘日又高樓 濃翠柳 艷風(fēng)流 一朝凋落再難收
    玉山紅葉稀閱讀 327評論 3 3

友情鏈接更多精彩內(nèi)容