無需臨時變數交換四個變數


標題“無需臨時變數交換四個變數”是什麼意思?

讓我們來解讀。這個問題要求我們交換四個變數的值,而無需建立任何額外的臨時變數。在各種程式語言中,使用臨時變數暫時儲存其中一個值可以簡化兩個變數值的交換。然而,當交換超過兩個變數的值時,使用臨時變數會變得低效且耗時。

解釋

假設我們有四個變數a、b、c和d,它們的值如下:

a = 5 (101)

b = 9 (1001)

c = 12 (1100)

d = 3 (0011)

我們想要在不使用臨時變數的情況下交換這些變數。

以下是我們可以使用異或運算來實現此目的的方法:

  • 計算 a = a ^ b ^ c ^ d。

    用二進位制表示,這等價於:

    a = 101 ^ 1001 ^ 1100 ^ 0011

    = 0010 (所有位異或的結果)

    現在a包含所有四個變數的異或結果。

  • 計算 d = a ^ b ^ c ^ d。

    用二進位制表示,這等價於:

    d = 0010 ^ 1001 ^ 1100 ^ 0011

    = 0100

    現在d包含a的原始值。

  • 計算 c = a ^ b ^ c ^ d。

    用二進位制表示,這等價於:

    c = 0010 ^ 1001 ^ 1100 ^ 0100

    = 1111

    現在c包含b的原始值。

  • 計算 b = a ^ b ^ c ^ d。

    用二進位制表示,這等價於:

    b = 0010 ^ 1001 ^ 1111 ^ 0100

    = 1010

    現在b包含c的原始值。

  • 計算 a = a ^ b ^ c ^ d。

    用二進位制表示,這等價於:

    a = 0010 ^ 1010 ^ 1111 ^ 0100

    = 1101

    現在a包含d的原始值。

經過這些步驟後,變數已在不使用臨時變數的情況下交換。

a = 3

b = 12

c = 9

d = 5

為什麼使用異或?

使用異或運算交換變數的原因是,它使我們能夠保留非公共位,同時消除兩個變數之間的公共位。它是這樣工作的:

假設我們想要在不使用臨時變數的情況下交換兩個變數A和B的值。使用異或運算子,我們可以按如下方式實現:

計算 A = A ^ B。

在此步驟中,A中與B不同的位將被設定為1,而與B相同的位將被設定為0。

計算 B = A ^ B。

由於它現在包含與B不同的位,因此我們可以使用A來翻轉B中的位以恢復A的初始值。

計算 A = A ^ B

可以使用A來翻轉B中與A的初始值不同的位,從而交換A和B的值。

透過對所有變數執行異或運算,可以將相同的推理擴充套件到交換兩個以上的變數。透過對所有變數進行異或運算,可以得到所有值的異或結果。然後,我們可以使用異或值和上面描述的步驟來交換變數。

為了在不需要臨時變數的情況下交換變數,異或運算允許我們修改數字的各個位,並消除公共位,同時保留非公共位。

方法

  • 將四個變數作為使用者輸入。

  • 使用異或運算在不使用臨時變數的情況下交換四個變數的值。

  • 列印a、b、c和d的交換值。

程式碼實現

示例

#include <iostream>
using namespace std;

int main() {
    int a, b, c, d;

a=5;
b=9;
c=12;
d=3;

    // print original values
    cout << "Original values: " << a << " " << b << " " << c << " " << d << endl;
    
    // swap values
    a = a ^ b ^ c ^ d;
    d = a ^ b ^ c ^ d;
    c = a ^ b ^ c ^ d;
    b = a ^ b ^ c ^ d;
    a = a ^ b ^ c ^ d;
    
    // print swapped values
    cout << "Swapped values: " << a << " " << b << " " << c << " " << d << endl;
    
    return 0;
}

輸出

Original values: 5 9 12 3
Swapped values: 9 12 3 5

複雜度

時間複雜度:O(1)

空間複雜度:O(1)

結論

總之,使用異或方法,在不需要臨時變數的情況下交換四個變數的值既簡單、高效又優雅。這種方法深受重視效率的程式設計師的歡迎,因為它使我們能夠在常數時間和空間複雜度的情況下交換值。透過理解這個概念,你可以在各種情況下使用它來最佳化你的程式碼並提高其效能。

更新於:2023年8月23日

622 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.