Java 交換兩數的方法


錯誤示范

1. 直接交換

public class SwapNumbers  {

	// 直接交換
	public static void swap(int a, int b) {
		int temp = a;
		a = b;
		b = temp;
	};

	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		System.out.println("交換前: a = " + a + "; b = " + b);
		swap(a, b);
		System.out.println("交換后: a = " + a + "; b = " + b);
	}
}

輸出結果:

交換前: a = 10; b = 20
交換后: a = 10; b = 20

2. 包裝類交換

public class SwapNumbers {

	// 包裝類交換
	public static void swap(Integer a, Integer b) {
		Integer temp = a;
		a = b;
		b = temp;
	};

	public static void main(String[] args) {
		Integer a = new Integer(10);
		Integer b = new Integer(20);
		System.out.println("交換前: a = " + a + "; b = " + b);
		swap(a, b);
		System.out.println("交換后: a = " + a + "; b = " + b);
	}
}

輸出結果:

交換前: a = 10; b = 20
交換后: a = 10; b = 20

正確示范

1. 數組交換

public class SwapNumbers {

	// 數組交換
	public static void swap(int[] arr) {
		int temp = arr[0];
		arr[0] = arr[1];
		arr[1] = temp;
	};

	public static void main(String[] args) {
		int[] arr = { 10, 20 };
		System.out.println("交換前: a = " + arr[0] + "; b = " + arr[1]);
		swap(arr);
		System.out.println("交換后: a = " + arr[0] + "; b = " + arr[1]);
	}
}

輸出結果:

交換前: a = 10; b = 20
交換后: a = 20; b = 10

2. 成員變量交換

public class SwapNumbers {
	public int a;
	public int b;

	// 成員對象交換
	public void swap(int a, int b) {
		this.a = b;
		this.b = a;
	};

	public static void main(String[] args) {
		SwapNumbers sn = new SwapNumbers();
		int a = sn.a = 10;
		int b = sn.b = 20;
		System.out.println("交換前: a = " + sn.a + " b=" + sn.b);
		sn.swap(a, b);
		System.out.println("交換前: a = " + sn.a + " b=" + sn.b);
	}
}

輸出結果:

交換前: a = 10; b = 20
交換后: a = 20; b = 10

交換兩個數的方法

1. 通過臨時變量存放交換

public class SwapNumbers {

	public static void swap(int[] arr) {
		int temp = arr[0];
		arr[0] = arr[1];
		arr[1] = temp;
	};

	public static void main(String[] args) {
		int[] arr = { 10, 20 };
		System.out.println("交換前: a = " + arr[0] + "; b = " + arr[1]);
		swap(arr);
		System.out.println("交換后: a = " + arr[0] + "; b = " + arr[1]);
	}
}

輸出結果:

交換前: a = 10; b = 20
交換后: a = 20; b = 10

2. 通過加減計算交換

public class SwapNumbers {

	public static void swap(int[] arr) {
		arr[0] = arr[0] + arr[1];  
		arr[1] = arr[0] - arr[1];  
		arr[0] = arr[0] - arr[1]; 
	};

	public static void main(String[] args) {
		int[] arr = { 10, 20 };
		System.out.println("交換前: a = " + arr[0] + "; b = " + arr[1]);
		swap(arr);
		System.out.println("交換后: a = " + arr[0] + "; b = " + arr[1]);
	}
}

輸出結果:

交換前: a = 10; b = 20
交換后: a = 20; b = 10

3. 通過異或運算交換

public class SwapNumbers {

	public static void swap(int[] arr) {
		arr[0] = arr[0] ^ arr[1];  
		arr[1] = arr[0] ^ arr[1];  
		arr[0] = arr[0] ^ arr[1]; 
	};

	public static void main(String[] args) {
		int[] arr = { 10, 20 };
		System.out.println("交換前: a = " + arr[0] + "; b = " + arr[1]);
		swap(arr);
		System.out.println("交換后: a = " + arr[0] + "; b = " + arr[1]);
	}
}

輸出結果:

交換前: a = 10; b = 20
交換后: a = 20; b = 10

通過異或運算交換的原理

按位異或運算是指兩個相應的二進制相同時結果為0,否則為1。

a ^ b ^ b 、 (ab)b 和 a(bb) 結果是相同的。

主要的原理是:

(1)一個變量按位異或自己的結果為0,即:a ^ a = 0;

(2)一個變量按位異或0的結果為自己,即:a ^ 0 = a;

a = a ^ b; 		// 語句1

b = a ^ b; 		// 語句2

a = a ^ b;		// 語句3

於是,在上面的三條語句中,

語句1可以看做把變量a、b保存到a的存儲空間中(當然這只是一種理解方式);

語句2消去了b(原理1),於是剩下了a(原理2),賦值到b的存儲空間,此刻,b變量已經得到了a的值;

語句3中,原本a變量存儲空間內已經同時保存了a、b,此刻,b已經變成了a,所以兩個按位異或后,便消去了a(原理1),只剩下了b(原理2),將它賦值給a,

至此,交換變量的過程結束。

總結

方式一是最常見的,可讀性高,但是需要在內存中存放臨時變量,但是對於現在來說,需要的內存空間很小,而且存放臨時變量的內存很快就會釋放,不存在問題。

方式二有缺陷,當兩個數相加之后,可能其結果超出了變量類型能表達的最大范圍,這個時候結果就會出問題,不推薦使用

方式三效率是最高的,但是可讀性不是很好。

在程序中盡可能的使用方式一,提高程序的可讀性。但是需要了解方式三,以及方式三的原理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM