1. 程式人生 > 實用技巧 >2019百度之星複賽的幾道題

2019百度之星複賽的幾道題

1、簡介

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

稀疏陣列的處理方法是:

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

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

原理圖:

2、稀疏陣列的程式碼實現

public class SparseArray {
    public static void main(String[] args) {
        //建立一個原始的二維陣列 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(); } //將稀疏陣列恢復成原始的二位陣列 //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();
    }
}