無需臨時變數交換四個變數
標題“無需臨時變數交換四個變數”是什麼意思?
讓我們來解讀。這個問題要求我們交換四個變數的值,而無需建立任何額外的臨時變數。在各種程式語言中,使用臨時變數暫時儲存其中一個值可以簡化兩個變數值的交換。然而,當交換超過兩個變數的值時,使用臨時變數會變得低效且耗時。
解釋
假設我們有四個變數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)
結論
總之,使用異或方法,在不需要臨時變數的情況下交換四個變數的值既簡單、高效又優雅。這種方法深受重視效率的程式設計師的歡迎,因為它使我們能夠在常數時間和空間複雜度的情況下交換值。透過理解這個概念,你可以在各種情況下使用它來最佳化你的程式碼並提高其效能。
資料結構
網路
關係資料庫管理系統(RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP