3.稀疏數(shù)組

1.實際需求

五子棋程序中有存盤和復(fù)盤的功能。


image.png

2.分析問題

使用二維數(shù)組來存的話,會有很多默認(rèn)的0值,也就是沒有意義的值,此時需要引入稀疏數(shù)組來解決。

3.稀疏數(shù)組介紹

當(dāng)一個數(shù)組中大部分元素的值為0,或者大部分元素的值相同時,可以使用稀疏數(shù)組來保存該數(shù)組中的元素。
稀疏數(shù)組是怎么設(shè)計的?
1.它是行數(shù)不確定,3列的一個數(shù)組。
2.第一行記錄原始二維數(shù)組有多少行,多少列和多少個不同的值。
3.其它行用來記錄這些值在二維數(shù)組的行,列和值。
例如:


image.png
  • 稀疏數(shù)組第一行記錄了目標(biāo)二維數(shù)組中有6行,7列,8個不同的值(不包含0).
  • 第二行記錄了22在二維數(shù)組中的行、列、值。

4.代碼實現(xiàn)

image.png
4.1思路分析
  • 二維數(shù)組轉(zhuǎn)稀疏數(shù)組:
    1.遍歷原始二維數(shù)組,找出數(shù)組中有效值個數(shù)sum.
    2.根據(jù)sum創(chuàng)建稀疏數(shù)組sparseArr = new int[sum+1][3]
    3.將二維數(shù)組中元素信息寫到稀疏數(shù)組中
  • 稀疏數(shù)組轉(zhuǎn)二維數(shù)組
    1.根據(jù)稀疏數(shù)組第一行值創(chuàng)建二維數(shù)組,例如chessArr = new int[11][11].
    2.讀取稀疏數(shù)組后幾行數(shù)據(jù)賦值給二維數(shù)組即可。
package com.yc.day01;

import java.util.Arrays;

/**
 * 練習(xí)二維數(shù)組轉(zhuǎn)稀疏數(shù)組
 * */
public class SparseArr {
    public static void main(String[] args) {
        int chessArr[][] = new int[11][11];
        chessArr[1][2] = 1;
        chessArr[2][3] = 2;
        System.out.println("原始二維數(shù)組:");
        printArr(chessArr);
        System.out.println("稀疏數(shù)組:");
        int[][] sparseArr = chessArrToSparseArr(chessArr);
        printArr(sparseArr);
        System.out.println("稀疏轉(zhuǎn)二維數(shù)組:");
        int[][] newChessArr = sparseArrToChessArr(sparseArr);
        printArr(newChessArr);

    }
    /**二維數(shù)組轉(zhuǎn)稀疏數(shù)組*/
    public static int[][] chessArrToSparseArr(int[][] chessArr){
        int sum = getValidNumCount(chessArr);
        int sparseArr[][] = new int[sum+1][3];
        setSparseValue(chessArr,sparseArr,sum);
        return sparseArr;
    }
    /**稀疏數(shù)組轉(zhuǎn)二維數(shù)組*/
    public static int[][] sparseArrToChessArr(int[][] sparseArr){
        int row = sparseArr[0][0];
        int col = sparseArr[0][1];
        int[][] chessArr = new int[row][col];
        for(int i =1;i<sparseArr.length;i++){
            chessArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        return chessArr;
    }
    /**打印數(shù)組*/
    public static void  printArr(int[][] chessArr){
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr[0].length; j++) {
                System.out.print(chessArr[i][j]+"\t");
            }
            System.out.println();
        }
    }
    /**獲取二維數(shù)組中不為0的值的個數(shù)*/
    public static int getValidNumCount(int[][] chessArr){
        int count = 0;
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr[0].length; j++) {
               if(chessArr[i][j]!=0){
                   count++;
               }
            }
        }
        return count;
    }
    /**設(shè)置稀疏數(shù)組值*/
    public static void setSparseValue(int[][] chessArr,int[][] sparseArr,int sum){
        sparseArr[0][0] = chessArr.length;
        sparseArr[0][1] = chessArr[0].length;
        sparseArr[0][2] = sum;
        int count = 0;
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr[0].length; j++) {
                if(chessArr[i][j]!=0){
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr[i][j];
                }
            }
        }
    }
}

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容