2019百度之星複賽的幾道題
阿新 • • 發佈:2020-07-25
1、簡介
當一個數組中的大部分元素為0,或者為同一個值時,可以使用稀疏陣列來儲存該陣列
稀疏陣列的處理方法是:
1)記錄該陣列一共幾行幾列,有多少個不同的值
2)把具有不同值的元素的行列及值記錄在一個小規模的陣列中,從而縮減程式的規模
原理圖:
2、稀疏陣列的程式碼實現
public class SparseArray { public static void main(String[] args) { //建立一個原始的二維陣列 11x11 //0: 表示沒有棋子 1:表示黑子 2:表示白子 int chessArray1[][]= newint[11][11]; chessArray1[1][2] = 1; chessArray1[2][3] =2; //輸出原始的二維陣列 for(int i=0;i<chessArray1.length;i++){ for(int j=0;j<11;j++){ System.out.printf("%d\t",chessArray1[i][j]); } System.out.println(); }//將二維陣列轉成稀疏陣列 //1、遍歷二維陣列,得到非0的個數 int sum= 0; for(int i=0;i<chessArray1.length;i++){ for(int j=0;j<11;j++){ if(chessArray1[i][j]!=0){ sum++; } } } //2、建立對用的稀疏陣列 int sparseArr[sum+1][3] intsparseArray[][] = new int[sum+1][3]; //3、給稀疏陣列賦值 //3.1 給第一行賦值 sparseArray[0][0] = 11; sparseArray[0][1] = 11; sparseArray[0][2] = sum; //3.2 給剩餘的其他行賦值 int count = 1; //記錄稀疏陣列的行號 for(int i=0;i<chessArray1.length;i++){ for(int j=0;j<11;j++){ if(chessArray1[i][j]!=0){ sparseArray[count][0]=i; sparseArray[count][1]=j; sparseArray[count][2]=chessArray1[i][j]; count++; } } } //輸出稀疏陣列 System.out.println("得到的稀疏陣列為:"); for(int i=0;i<sparseArray.length;i++){ for(int j=0;j<3;j++){ System.out.printf("%d\t",sparseArray[i][j]); } System.out.println(); } //將稀疏陣列恢復成原始的二位陣列 //1、先讀取稀疏陣列的第一行,根據第一行的資料,建立原始的二維陣列 int[][] chessArray2 =new int[sparseArray[0][0]][sparseArray[0][1]]; //2、將稀疏陣列的後幾行資料,賦值給原來的二維陣列 for(int i=1;i<sparseArray.length;i++){ chessArray2[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2]; } //輸出復原後的二維陣列 System.out.println("復原後的二維陣列為:"); for(int i=0;i<chessArray2.length;i++){ for(int j=0;j<11;j++){ System.out.printf("%d\t",chessArray2[i][j]); } System.out.println(); } } }
3、課後練習
public class ArrayStore { public static void main(String[] args) throws IOException, IOException { //建立一個原始的二維陣列 11x11 //0: 表示沒有棋子 1:表示黑子 2:表示白子 int chessArray1[][]= new int[11][11]; chessArray1[1][2] = 1; chessArray1[2][3] =2; //輸出原始的二維陣列 for(int i=0;i<chessArray1.length;i++){ for(int j=0;j<11;j++){ System.out.printf("%d\t",chessArray1[i][j]); } System.out.println(); } //將二維陣列轉成稀疏陣列 //1、遍歷二維陣列,得到非0的個數 int sum= 0; for(int i=0;i<chessArray1.length;i++){ for(int j=0;j<11;j++){ if(chessArray1[i][j]!=0){ sum++; } } } //2、建立對用的稀疏陣列 int sparseArr[sum+1][3] int sparseArray[][] = new int[sum+1][3]; //3、給稀疏陣列賦值 //3.1 給第一行賦值 sparseArray[0][0] = 11; sparseArray[0][1] = 11; sparseArray[0][2] = sum; //3.2 給剩餘的其他行賦值 int count = 1; //記錄稀疏陣列的行號 for(int i=0;i<chessArray1.length;i++){ for(int j=0;j<11;j++){ if(chessArray1[i][j]!=0){ sparseArray[count][0]=i; sparseArray[count][1]=j; sparseArray[count][2]=chessArray1[i][j]; count++; } } } //輸出稀疏陣列 System.out.println("得到的稀疏陣列為:"); for(int i=0;i<sparseArray.length;i++){ for(int j=0;j<3;j++){ System.out.printf("%d\t",sparseArray[i][j]); } System.out.println(); } //檔案的路徑 String str = "d:/sparse.txt"; File file = new File(str); //如果磁碟中該檔案不存在,則建立該檔案 if (!file.exists()){ file.createNewFile(); } //建立字元寫入流物件 FileWriter fileWriter = new FileWriter(str); for (int i = 0; i < sparseArray.length; i++) { for (int j = 0; j < sparseArray[i].length; j++) { //寫入每個字元 fileWriter.write(sparseArray[i][j]); } } //關閉寫入流 fileWriter.close(); System.out.println("寫入完畢"); //建立新的陣列,來接收讀取的資料 int [][] sparseArr2 = new int[sum+1][3]; FileReader fileReader = new FileReader(str); for (int i = 0; i < sparseArr2.length; i++) { for (int j = 0; j < sparseArray[i].length; j++) { //把讀取的資料設定到陣列中 sparseArr2[i][j] = fileReader.read(); } } System.out.println("從檔案讀出的稀疏陣列為:"); for(int i=0;i<sparseArr2.length;i++){ for(int j=0;j<3;j++){ System.out.printf("%d\t",sparseArr2[i][j]); } System.out.println(); } //關閉讀取流 fileReader.close(); } }