1. 程式人生 > 其它 >LeetCode> 71. 簡化路徑

LeetCode> 71. 簡化路徑

陣列的定義

  • 陣列是相同型別資料的有序集合

  • 陣列描述的是相同型別的若干個資料,按照一定的先後次序排列組合而成

  • 其中,每一個數據稱作一個數組元素,每個陣列元素可以通過一個下標來訪問它們

 

陣列宣告建立

  1. 首先必須宣告陣列變數,才能在程式中使用陣列。下面是宣告陣列變數的語法:

    dataType[] arrayRefVar;//首選的方法

    dataType arrayRefVar[];//效果相同,但不是首選方法
  2. Java語言使用new操作符來建立陣列,語法如下:

    dataType[] arrayRefVar = new dataTpe[araySize];
  3. 陣列的元素是通過索引訪問的,陣列索引從0開始

  4. 獲取陣列長度:arrays.length

 

記憶體分析

Java記憶體分析:

 

陣列的四大基本特點

  1. 其長度是確定的。陣列一旦被建立,它的大小就是不可以改變的

  2. 其元素必須是相同型別,不允許出現混合型別

  3. 陣列中的元素可以是任何資料型別,包括基本型別和引用型別

  4. 陣列變數屬引用型別,陣列也可以看成是物件,陣列中的每個元素相當於該物件的成員變數

    陣列本身就是物件,Java中物件是在堆中的,因此陣列無論儲存原始型別還是其他資料型別,陣列物件本身是在堆中的

 

陣列邊界

  • 下標的合法區間:[0,length-1],如果越界就會報錯

    public static void main(String args[]){
    int[] a = new int[2];
    System.out.println(a[2]);
    }
  • ArrayIndexOutOfBoundsException:陣列下標越界異常!

  • 小結:

    1. 陣列是相同資料型別(資料型別可以為任意型別)的有序集合

    2. 陣列也是物件。陣列元素相當於物件的成員變數

    3. 陣列長度是確定的,不可變的。如果越界,則報:ArrayIndexOutOfBoundsException

 

陣列使用

  • for-each 迴圈

    int[] arrays = {1,2,3,4,5};
    for(int array : arrays){
    System.out.println(array);
    }
  • 陣列作方法入參

    public class arr {
       public static void main(String[] args) {
           int[] arrs = {10,15,20};
           printArrays(arrs);
      }
       public static void printArrays(int[] arrs){
           for (int num:arrs){
               System.out.println(num);
          }
      }
    }

     

  • 陣列作返回值

    //反轉陣列
       public static int[] reverse(int[] arrs){
           int[] arrays = new int[arrs.length];
           for (int i = 0,j = arrays.length-1;i<arrays.length;i++,j--){
               arrays[i] = arrs[j];
          }
           return arrays;
      }

 

多維陣列

  • 多維陣列可以看成是陣列的陣列,比如二維陣列就是一個特殊的一維陣列,每個元素都是一維陣列

  • 二維陣列

    int a[][] = new int[2][5];

迴圈遍歷多維陣列

public class ArrayDemo02 {
   public static void main(String[] args) {
       //二維陣列
       int[][] arrs = new int[4][2];//四行兩列
       arrs = new int[][]{{1, 2}, {2, 3}, {3, 4}, {4, 5}};
       for (int i = 0 ;i<arrs.length;i++){
           for (int j:arrs[i]) {
               System.out.println(j);
          }
      }
  }
}

 

Arrays類

  • 陣列的工具類java.util.Arrays

  • 由於陣列物件本身並沒有什麼方法可以供我們呼叫,但是API中提供了一個工具類Arrays供我們使用,從而可以對資料物件進行一些基本的操作

  • 檢視JDK幫助文件

  • Arrays類中的方法都是static修飾的靜態方法,在使用的時候可以直接使用類名進行呼叫,而“不用”使用物件來呼叫(注意:是“不用”而不是“不能”)

  • 具有以下常用功能:

    1. 給陣列賦值:通過fill方法

      //陣列arr01從下標index1開始,到index2被值value填充(下標不寫預設全部填充)
      Arrays.fill(arr01,index1,index2,value);

       

    2. 對陣列排序:通過sort方法,按升序排序

      Arrays.sort(陣列名);

       

    3. 比較陣列:通過equals方法比較陣列中元素值是否相等

              int[] a = {1,2,3};
             int[] b = {1,2,3};
             System.out.println(Arrays.equals(a,b));//true

       

    4. 查詢陣列元素:通過binarySearch方法能對排序好的陣列進行二分查詢法操作

      //在陣列a中,下標formIndex和toIndex之間查詢值為key的下標,查到返回下標,未查到返回-1
      //不一定是int陣列,formIndex和toIndex可不寫,表示全部查詢
      binarySearch(int[] a, int fromIndex, int toIndex, int key)

       

氣泡排序

Java八大排序

  1. 氣泡排序

  2. 選擇排序

  3. 插入排序

  4. 希爾排序

  5. 堆排序

  6. 快速排序

  7. 歸併排序

  8. 計數排序

 

程式碼實現

public static int[] sort(int[] arr){
       //臨時變數
       int temp = 0;
       //外層迴圈,判斷我們要走多少次
       for (int i = 0 ;i<arr.length-1;i++){
           //比價判斷,如果第一個數比第二個數大就交換位置
           for (int j = 0;j<arr.length-1-i;j++){
               if (arr[j]>arr[j+1]) {
                   temp = arr[j];
                   arr[j] = arr[j + 1];
                   arr[j + 1] = temp;
              }
          }
      }
       return arr;
  }

 

稀疏陣列介紹

  • 當一個數組中大部分元素為0,或者為同一值的陣列時,可以使用稀疏陣列來儲存該陣列

  • 稀疏陣列的處理方式是:

    1. 記錄陣列一共有幾行幾列,有多少個不同值

    2. 把具體不同值的元素和行列及值記錄在一個小規模的陣列中,從而縮小程式的規模

  • 如下圖,左邊是原始陣列,右邊是稀疏陣列

[0]:一共6行7列,共有八個值;

[1]:下標0行3列,值為22....

 

程式碼實現:

public static void main(String[] args) {
       //建立一個二維陣列 棋盤11*11,0:無棋;1.黑棋;2.白棋
       int[][] arr01 = new int[11][11];
       arr01[1][2] = 1;//設定棋盤第1行第2列為黑棋(從0行0列開始)
       arr01[2][3] = 2;//設定棋盤第2行第3列為白棋
       System.out.println("輸出原始陣列:");
       for (int[] arr : arr01){
           for (int num : arr){
               System.out.print(num+"\t");
          }
           System.out.println();
      }
       //轉換為稀疏陣列
       int count = 0;//黑白棋總數
       for (int[] arr : arr01){
           for (int num : arr){
               if(num!=0)
                   count++;//如果有棋,計數+1
          }
      }
       int[][] arr02 = new int[count+1][3];
       arr02[0][0] = arr01.length;
       arr02[0][1] = arr01[0].length;
       arr02[0][2] = count;
       int index = 1;//行座標,從1開始,因為第0行用來統計行數列數和棋子數
       for (int i = 0;i<arr01.length;i++){//從二維陣列第0行開始查詢
           for (int j = 0;j<arr01[i].length;j++){//從二維陣列當前行第0列開始查詢
               if (arr01[i][j]!=0){//如果找到棋子數
                   arr02[index][0] = i;//行數放入稀疏陣列行數
                   arr02[index][1] = j;//列數放入稀疏陣列列數
                   arr02[index][2] = arr01[i][j];//值放入稀疏陣列值
                   index++;//放完+1統計下一個棋子
              }
          }
      }
       //遍歷稀疏陣列
       System.out.println("稀疏陣列:");
       for (int[] arr : arr02){
           for (int num : arr){
               System.out.print(num+"\t");
          }
           System.out.println();
      }
       //將稀疏陣列轉為二維陣列
       System.out.println("1:"+arr02[0][0]+"/2:"+arr02[0][1]);
       int[][] arr03 = new int[arr02[0][