B站学习数据结构笔记(1)=====>稀疏数组

学习来源–>传送门–>尚硅谷Java数据结构与java算法(Java数据结构与算法)


程序==数据结构+算法

数据结构包括 线性结构与非线性的结构

线性结构: 特点;数据元素之间存在着一对一的线性关系;
但是;线性结构又分为顺序存储结构(顺序表)与链式存储结构(链表)

  • 顺序表:元素连续;
  • 链表: 元素不一定连续;元素的节点中会存储数据元素以及相邻的元素的地址信息;
    常见线性结构->数组,队列,链表,栈

非线性结构
二维数组;多维数组;广义表;树结构;图结构


比如说有一块棋盘;0表示 没有棋子; 1表示黑子; 2表示 白子;

由于存在着比较多的空位;现在考虑把放了棋子的位置存下来即可;

那么就用稀疏数组; 稀疏数组有3列;第一行分别存入 棋盘的行;棋盘的列 棋盘上棋子的个数;
其他行存放棋子的行列位置和棋子的具体( 黑1 白2);

具体的思路;

  • 首先去遍历原来的二维数组棋盘;并且计算出放了棋子的个数 num;
  • 然后创建稀疏数组; 稀疏数组的行数为 (num+1) 列数为3;
    然后再遍历原二维数组,把放棋子的位置和棋子信息存入稀疏数组

那么得到稀疏数组后,现在还要恢复到原来的二维数组;

  • 首先根据稀疏数组的第一行;得到要恢复的数组是几行几列,有几个棋子;
  • 然后就是遍历读取稀疏数组的数据,给二维数组放到指定的位置;

具体实现

package day01forarray;

/**
 * @author by CSDN@小智RE0
 * @date 2021-10-30 20:25
 * 稀疏数组
 */
public class XSArray {
    public static void main(String[] args) {
        //创建二维数组 -->棋盘  0 : 没有放棋子; 1: 黑子; 0 :白子
        //本次做一个12*12的棋盘;
        int[][] startArray = new int[12][12];
        //放入棋子
        startArray[0][0]   = 2;
        startArray[1][10]  = 1;
        startArray[3][9]   = 2;
        startArray[4][0]   = 2;
        startArray[5][6]   = 1;
        startArray[8][1]   = 1;
        startArray[10][5]  = 2;
        startArray[11][11] = 1;


        System.out.println("--------------原始棋盘------------------");
        //遍历原数组;
        for (int[] rows : startArray) {
            for (int chess : rows) {
                System.out.print(chess+"\t");
            }
            //换行;
            System.out.println();
        }

        System.out.println("--------------二维数组转稀疏数组------------------");
        //1.遍历原数组;得到放置的棋子个数
        //定义标记数值;
        int num = 0;
        for (int[] ints : startArray) {
            for (int anInt : ints) {
                if(anInt!=0){
                    num++;
                }
            }
        }
        System.out.println("有效的棋子个数----->"+num);

        //2.创建稀疏数组;
        int[][] fewArray = new int[num+1][3];
        fewArray[0][0] = 12;
        fewArray[0][1] = 12;
        fewArray[0][2] = num;

        //3.将二维数组的值存入稀疏数组;
        //这里需要定义计数器进行换行 存值;
        int count = 0;

        for (int i = 0; i < startArray.length; i++) {
            for (int j = 0; j < startArray[i].length; j++) {
                if(startArray[i][j]!=0){
                    count++;
                    fewArray[count][0]=i;
                    fewArray[count][1]=j;
                    fewArray[count][2]=startArray[i][j];
                }
            }
        }

        //输出查看稀疏数组;
        System.out.println("-----------转换的稀疏数组-------------");
        for (int[] ints : fewArray) {
            System.out.println(ints[0] + "\t"
                    + ints[1] + "\t"
                    + ints[2] + "\t"
            );
        }


        //稀疏数组转二维数组还原;
        System.out.println("------------稀疏数组转二维数组----------------");

        //1.首先读取稀疏数组的第一行;创建二维数组;
        int[][] recoverArray = new int[fewArray[0][0]][fewArray[0][1]];

        //2.然后由稀疏数组的第二行开始,读取存储数据;
        for (int i = 1; i < fewArray.length; i++) {
            recoverArray [fewArray[i][0]] [fewArray[i][1]] = fewArray[i][2];
        }

        //输出恢复数组
        System.out.println("-----------恢复后的二维数组--------------------");
        for (int[] ints : recoverArray) {
            for (int i : ints) {
                System.out.print(i+"\t");
            }
            //换行
            System.out.println();
        }

    }
}

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小智RE0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值