『JavaSE』數組的使用

1 數組轉字符串

使用該後續打印數組就更方便一些

import java.util.Arrays
int[] arr = {1,2,3,4,5,6};
String newArr = Arrays.toString(arr);
System.out.println(newArr);
// 執行結果
[1, 2, 3, 4, 5, 6]

實現一個自己版本的數組轉字符串

public static void main(String[] args) {
	int[] arr = {1,2,3,4,5,6};
	System.out.println(toString(arr));
}
public static String toString(int[] arr) {
	String ret = "[";
	for (int i = 0; i < arr.length; i++) {
		// 藉助 String += 進行拼接字符串
		ret += arr[i];
		// 除了最後一個元素之外, 其他元素後面都要加上 ", "
		if (i != arr.length - 1) {
			ret += ", ";
		}
	}
	ret += "]";
	return ret;
}

2 數組拷貝

import java.util.Arrays

int[] arr = {1,2,3,4,5,6};
int[] newArr = Arrays.copyOf(arr, arr.length);
System.out.println("newArr: " + Arrays.toString(newArr));

arr[0] = 10;
System.out.println("arr: " + Arrays.toString(arr));
System.out.println("newArr: " + Arrays.toString(newArr));

注意事項: 相比於 newArr = arr 這樣的賦值, copyOf 是將數組進行了 深拷貝, 即又創建了一個數組對象, 拷貝原有數組中的所有元素到新數組中. 因此, 修改原數組, 不會影響到新數組.

實現自己版本的拷貝數組:

public static int[] copyOf(int[] arr) {
	int[] ret = new int[arr.length];
	for (int i = 0; i < arr.length; i++) {
		ret[i] = arr[i];
	}
	return ret;
}

3 找數組中的最大元素

public static void main(String[] args) {
	int[] arr = {1,2,3,4,5,6};
	System.out.println(max(arr));
}
public static int max(int[] arr) {
	int max = arr[0];
	for (int i = 1; i < arr.length; i++) {
		if (arr[i] > max) {
			max = arr[i];
		}
	}
	return max;
}
// 執行結果
6

類似於 “打擂臺” 這樣的過程. 其中 max 變量作爲 擂臺, 比擂臺上的元素大, 就替換上去, 否則就下一個對手.

4 求數組中元素的平均值

給定一個整型數組, 求平均值

public static void main(String[] args) {
	int[] arr = {1,2,3,4,5,6};
	System.out.println(avg(arr));
}
public static double avg(int[] arr) {
	int sum = 0;
	for (int x : arr) {
		sum += x;
	}
	return (double)sum / (double)arr.length;
}
// 執行結果
3.5

注意事項: 結果要用 double 來表示.

5 查找數組中指定元素(順序查找)

給定一個數組, 再給定一個元素, 找出該元素在數組中的位置.

public static void main(String[] args) {
	int[] arr = {1,2,3,10,5,6};
	System.out.println(find(arr, 10));
}
public static int find(int[] arr, int toFind) {
	for (int i = 0; i < arr.length; i++) {
		if (arr[i] == toFind) {
			return i;
		}
	}
	return -1; // 表示沒有找到
}
// 執行結果
3

6 查找數組中指定元素(二分查找)

針對有序數組, 可以使用更高效的二分查找.有序分爲 “升序” 和 “降序”
以升序數組爲例, 二分查找的思路是先取中間位置的元素, 看要找的值比中間元素大還是小. 如果小, 就去左邊找; 否則就去右邊找.

public static void main(String[] args) {
	int[] arr = {1,2,3,4,5,6};
	System.out.println(binarySearch(arr, 6));
}
public static int binarySearch(int[] arr, int toFind) {
	int left = 0;
	int right = arr.length - 1;
	while (left <= right) {
		int mid = (left + right) / 2;
		if (toFind < arr[mid]) {
		// 去左側區間找
		right = mid - 1;
		} else if (toFind > arr[mid]) {
		// 去右側區間找
		left = mid + 1;
		} else {
		// 相等, 說明找到了
		return mid;
		}
	}
	// 循環結束, 說明沒找到
	return -1;
}

// 執行結果
5

隨着數組元素個數越多, 二分的優勢就越大.

7 檢查數組的有序性

給定一個整型數組, 判斷是否該數組是有序的(升序)

public static void main(String[] args) {
	int[] arr = {1,2,3,10,5,6};
	System.out.println(isSorted(arr));
}
public static boolean isSorted(int[] arr) {
	for (int i = 0; i < arr.length - 1; i++) {
		if (arr[i] > arr[i + 1]) {
			return false;
		}
	}
	return true;
}

8數組逆序

給定一個數組, 將裏面的元素逆序排列

思路:設定兩個下標, 分別指向第一個元素和最後一個元素. 交換兩個位置的元素.然後讓前一個下標自增, 後一個下標自減, 循環繼續即可.

public static void main(String[] args) {
	int[] arr = {1, 2, 3, 4};
	reverse(arr);
	System.out.println(Arrays.toString(arr));
}
public static void reverse(int[] arr) {
	int left = 0;
	int right = arr.length - 1;
	while (left < right) {
		int tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
}

9數組數字排列

給定一個整型數組, 將所有的偶數放在前半部分, 將所有的奇數放在數組後半部分。例如{1, 2, 3, 4}調整後得到{4, 2, 3, 1}

基本思路
設定兩個下標分別指向第一個元素和最後一個元素.用前一個下標從左往右找到第一個奇數, 用後一個下標從右往左找到第一個偶數, 然後交換兩個位置的元素.依次循環即可.

public static void main(String[] args) {
	int[] arr = {1, 2, 3, 4, 5, 6};
	transform(arr);
	System.out.println(Arrays.toString(arr));
}
public static void transform(int[] arr) {
	int left = 0;
	int right = arr.length - 1;
	while (left < right) {
		// 該循環結束, left 就指向了一個奇數
		while (left < right && arr[left] % 2 == 0) {
			left++;
		}
		// 該循環結束, right 就指向了一個偶數
		while (left < right && arr[right] % 2 != 0) {
			right--;
		}
		// 交換兩個位置的元素
		int tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章