LeetCode> 71. 簡化路徑
-
陣列是相同型別資料的有序集合
-
陣列描述的是相同型別的若干個資料,按照一定的先後次序排列組合而成
-
其中,每一個數據稱作一個數組元素,每個陣列元素可以通過一個下標來訪問它們
陣列宣告建立
-
首先必須宣告陣列變數,才能在程式中使用陣列。下面是宣告陣列變數的語法:
dataType[] arrayRefVar;//首選的方法
或
dataType arrayRefVar[];//效果相同,但不是首選方法 -
Java語言使用new操作符來建立陣列,語法如下:
dataType[] arrayRefVar = new dataTpe[araySize];
-
陣列的元素是通過索引訪問的,陣列索引從0開始
-
獲取陣列長度:arrays.length
記憶體分析
Java記憶體分析:
陣列的四大基本特點
-
其長度是確定的。陣列一旦被建立,它的大小就是不可以改變的
-
其元素必須是相同型別,不允許出現混合型別
-
陣列中的元素可以是任何資料型別,包括基本型別和引用型別
-
陣列變數屬引用型別,陣列也可以看成是物件,陣列中的每個元素相當於該物件的成員變數
陣列本身就是物件,Java中物件是在堆中的,因此陣列無論儲存原始型別還是其他資料型別,陣列物件本身是在堆中的
陣列邊界
-
下標的合法區間:[0,length-1],如果越界就會報錯
public static void main(String args[]){
int[] a = new int[2];
System.out.println(a[2]);
} -
ArrayIndexOutOfBoundsException:陣列下標越界異常!
-
小結:
-
陣列是相同資料型別(資料型別可以為任意型別)的有序集合
-
陣列也是物件。陣列元素相當於物件的成員變數
-
陣列長度是確定的,不可變的。如果越界,則報: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修飾的靜態方法,在使用的時候可以直接使用類名進行呼叫,而“不用”使用物件來呼叫(注意:是“不用”而不是“不能”)
-
具有以下常用功能:
-
給陣列賦值:通過fill方法
//陣列arr01從下標index1開始,到index2被值value填充(下標不寫預設全部填充)
Arrays.fill(arr01,index1,index2,value); -
對陣列排序:通過sort方法,按升序排序
Arrays.sort(陣列名);
-
比較陣列:通過equals方法比較陣列中元素值是否相等
int[] a = {1,2,3};
int[] b = {1,2,3};
System.out.println(Arrays.equals(a,b));//true -
查詢陣列元素:通過binarySearch方法能對排序好的陣列進行二分查詢法操作
//在陣列a中,下標formIndex和toIndex之間查詢值為key的下標,查到返回下標,未查到返回-1
//不一定是int陣列,formIndex和toIndex可不寫,表示全部查詢
binarySearch(int[] a, int fromIndex, int toIndex, int key)
-
氣泡排序
Java八大排序
-
氣泡排序
-
選擇排序
-
插入排序
-
希爾排序
-
堆排序
-
快速排序
-
歸併排序
-
計數排序
程式碼實現
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,或者為同一值的陣列時,可以使用稀疏陣列來儲存該陣列
-
稀疏陣列的處理方式是:
-
記錄陣列一共有幾行幾列,有多少個不同值
-
把具體不同值的元素和行列及值記錄在一個小規模的陣列中,從而縮小程式的規模
-
-
如下圖,左邊是原始陣列,右邊是稀疏陣列
[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][