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;
}
}