数组练习

74 阅读3分钟

数组练习

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]

使用这个方法后续打印数组就更方便一些. Java 中提供了 java.util.Arrays 包, 其中包含了一些操作数组的常用方法

2.数组拷贝

示例:

 public static void func(){
 // newArr和arr引用的是同一个数组
 // 因此newArr修改空间中内容之后,arr也可以看到修改的结果
 int[] arr = {1,2,3,4,5,6};
 int[] newArr = arr;
 newArr[0] = 10;
 System.out.println("newArr: " + Arrays.toString(arr));
     
 // 使用Arrays中copyOf方法完成数组的拷贝:
 // copyOf方法在进行数组拷贝时,创建了一个新的数组
 // arr和newArr引用的不是同一个数组
 arr[0] = 1;
 newArr = Arrays.copyOf(arr, arr.length);
 System.out.println("newArr: " + Arrays.toString(newArr));
     
 // 因为arr修改其引用数组中内容时,对newArr没有任何影响
 arr[0] = 10;
 System.out.println("arr: " + Arrays.toString(arr));
 System.out.println("newArr: " + Arrays.toString(newArr));
     
 // 拷贝某个范围.
 int[] newArr2 = Arrays.copyOfRange(arr, 2, 4);
 System.out.println("newArr2: " + Arrays.toString(newArr2));

image.png image.png

3 求数组中元素的平均值

示例

 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

4 查找数组中指定元素(顺序查找)

给定一个数组, 再给定一个元素, 找出该元素在数组中的位置.

 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 data) {
     for (int i = 0; i < arr.length; i++) {
         if (arr[i] == data) {
             return i;
         }
     } 
     return -1; // 表示没有找到
 } 
 ​
 // 执行结果
 3

5 查找数组中指定元素(二分查找)

针对有序数组, 可以使用更高效的二分查找

啥叫有序数组? 有序分为 "升序" 和 "降序" 如 1 2 3 4 , 依次递增即为升序. 如 4 3 2 1 , 依次递减即为降序.

以升序数组为例, 二分查找的思路是先取中间位置的元素, 然后使用待查找元素与数组中间元素进行比较:

  • 如果相等,即找到了返回该元素在数组中的下标
  • 如果小于,以类似方式到数组左半侧查找
  • 如果大于,以类似方式到数组右半侧查找

代码示例

 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

6 数组排序(冒泡排序)

给定一个数组, 让数组升序 (降序) 排序

算法思路 假设排升序:

  1. 将数组中相邻元素从前往后依次进行比较,如果前一个元素比后一个元素大,则交换,一趟下来后最大元素就在数组的末尾
  1. 依次从上上述过程,直到数组中所有的元素都排列好

代码示例

 public static void main(String[] args) {
     int[] arr = {9, 5, 2, 7};
     bubbleSort(arr);
     System.out.println(Arrays.toString(arr));
 }
 public static void bubbleSort(int[] arr) {
     for (int i = 0; i < arr.length; i++) {
         for (int j = 1; j < arr.length-i; j++) {
             if (arr[j-1] > arr[j]) {
             int tmp = arr[j - 1];
             arr[j - 1] = arr[j];
             arr[j] = tmp;
             }
         }
     } 
 }
 // 执行结果
 [2, 5, 7, 9]

但是冒泡排序性能较低. Java 中内置了更高效的排序算法

 public static void main(String[] args) {
     int[] arr = {9, 5, 2, 7};
     Arrays.sort(arr);
     System.out.println(Arrays.toString(arr));
 }

7 数组逆序

给定一个数组, 将里面的元素逆序排列. 思路

设定两个下标, 分别指向第一个元素和最后一个元素. 交换两个位置的元素.然后让前一个下标自增, 后一个下标自减, 循环继续即可.

代码示例

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