Java稀疏数组
目录
1.稀疏数组
2.稀疏数组的使用
2.1 二维数组转换为稀疏数组
2.2 稀疏数组转换为二维数组
1.稀疏数组
稀疏数组(Sparse Array):当一个数组中的大部分元素为相同的值,可使用稀疏数组来保存该数组,可以将稀疏数组看做是普通数组的压缩
例如

数组arr中许多值为0,若对二维数组直接进行存储,则会存储许多相同的数值0,造成空间的浪费,此时,我们可以用稀疏数组对其进行存储
2.稀疏数组的使用
要对二维数组进行存储,我们需要知道二维数组的行和列、不同数值的数量以及不同元素的位置和值
稀疏数组的第一行,存放二维数组arr的行数、列数、不同数值的数量sum
后面几行,存放不同值元素在二维数组arr中的行、列、数值

代码实现
创建二维数组
int[][] arr = new int[6][5];arr[1][0] = 1;arr[1][3] = 6;arr[4][3] = 2;
2.1 二维数组转换为稀疏数组
(1)遍历二维数组,确定不同元素的个数sum
int sum = 0;for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[0].length; j++) {if(arr[i][j] != 0){sum++;}}}
(2)根据sum创建稀疏数组
int[][] sparseArr = new int[sum+1][3];
(3) 遍历二维数组,对稀疏数组进行赋值
//稀疏数组的第一行分别存放二维数组的行数、列数以及不同元素的个数sparseArr[0][0] = arr.length;sparseArr[0][1] = arr[0].length;sparseArr[0][2] = sum;//再对不同元素进行存储int k = 0;for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[0].length; j++) {if(arr[i][j] != 0){k++;//分别存放不同元素的行、列以及数值sparseArr[k][0] = i;sparseArr[k][1] = j;sparseArr[k][2] = arr[i][j];}}}
2.2 稀疏数组转换为二维数组
(1)创建二维数组
int[][] arr1 = new int[sparseArr[0][0]][sparseArr[0][1]];
(2)遍历稀疏数组, 对不同值元素进行赋值
//遍历稀疏数组,对不同值元素进行赋值for (int i = 1; i < sparseArr.length; i++) {arr1[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];}
完整代码
public class Test {public static void main(String[] args) {//创建二维数组int[][] arr = new int[6][5];arr[1][0] = 1;arr[1][3] = 6;arr[4][3] = 2;System.out.println("****二维数组****");for (int[] row: arr) {for (int data: row) {System.out.printf("%d ",data);}System.out.println();}int sum = 0;for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[0].length; j++) {if(arr[i][j] != 0){sum++;}}}//创建稀疏数组int[][] sparseArr = new int[sum+1][3];//稀疏数组的第一行分别存放二维数组的行数、列数以及不同元素的个数sparseArr[0][0] = arr.length;sparseArr[0][1] = arr[0].length;sparseArr[0][2] = sum;//再对不同元素进行存储int k = 0;for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[0].length; j++) {if(arr[i][j] != 0){k++;//分别存放不同元素的行、列以及数值sparseArr[k][0] = i;sparseArr[k][1] = j;sparseArr[k][2] = arr[i][j];}}}System.out.println("****稀疏数组****");for (int[] row: sparseArr) {for (int data: row) {System.out.printf("%d ",data);}System.out.println();}//创建二维数组int[][] arr1 = new int[sparseArr[0][0]][sparseArr[0][1]];//遍历稀疏数组,对不同值元素进行赋值for (int i = 1; i < sparseArr.length; i++) {arr1[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];}System.out.println("****二维数组****");for (int[] row: arr1) {for (int data: row) {System.out.printf("%d ",data);}System.out.println();}}
}
运行结果

相关文章:
Java稀疏数组
目录 1.稀疏数组 2.稀疏数组的使用 2.1 二维数组转换为稀疏数组 2.2 稀疏数组转换为二维数组 1.稀疏数组 稀疏数组(Sparse Array):当一个数组中的大部分元素为相同的值,可使用稀疏数组来保存该数组,可以将稀疏数组…...
内存管理框架 --- 基础知识
文章目录 一、内存管理1.1 内存管理的出现1.2 内存管理的用途1.2.1 虚拟内存和物理内存的定义1.2.1.1 什么是虚拟内存? 1.2.2 虚拟内存的划分:用户空间与内核空间 1.3 操作系统和MMU1.3.1 OS和MMU的关系1.3.2 虚拟地址到物理地址的映射流程 1.4 物理内存…...
React + Next.js 搭建项目(配有对比介绍一起食用)
文章标题 01 Next.js 是什么02 Next.js 搭建工具 create-next-app03 create-react-app 与 create-next-app 的区别04 快速构建 Next.js 项目05 App Router 与 Pages Router 的区别 01 Next.js 是什么 Next.js 是一个 React 框架,它允许你使用 React 框架建立超强的…...
【Java】Java基础
环境准备 安装JDK和JRE 下载JDK,可以在官网Java Downloads | Oracle 中国下载,但是这里需要注册才能够下载。在Index of java-local/jdk (huaweicloud.com)也可以下载到,但是版本比较老,关系不大,直接下载࿰…...
Spring-SpringBoot-SpringMVC-MyBatis常见面试题
文章目录 Spring篇springbean是安全的的?什么是AOP你们工作中有用过AOP吗spring中的事务是如何实现的spring中事务失效场景Spring的生命周期spring中的循坏依赖springMVC的执行流程springboot的启动原理常用注解MyBatis执行流程Mybatis是否支持延迟加载?Mybatis的一…...
15.MyCat数据库分片
MyCat 是一个开源的数据库中间件,主要用于将数据库操作请求路由和分发到后端的多个数据库节点。 1.Mycat环境搭建 在两个不同数据库中创建相同表 下载mycat https://github.com/MyCATApache/Mycat-Serverhttps://github.com/MyCATApache/Mycat-Server 将下…...
【Python】PySpark
前言 Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎。 简单来说,Spark是一款分布式的计算框架,用于调度成百上千的服务器集群,计算TB、PB乃至EB级别的海量数据…...
pycharm 打开Terminal时报错activate.ps1,因为在此系统上禁止运行脚本,并因此无法进入虚拟环境
pycharm 打开Terminal时报错activate.ps1,因为在此系统上禁止运行脚本,并因此无法进入虚拟环境 如下图所示: 网上说可以set_restrictFalse什么的,虽然也可但可能会降低电脑安全性,可以将下面的终端改为cmd.exe即可...
[C++][C#]yolox TensorRT C++ C#部署
YOLOX是一种新型的高性能探测器,由开发者Zheng Ge、Songtao Liu、Feng Wang、Zeming Li和Jian Sun在《YOLOX: Exceeding YOLO Series in 2021》首次提出。与YOLOV5和YOLOV8相比,YOLOX具有更高的性能和更好的平衡,在速度和精度方面都表现出优越…...
根据源码,模拟实现 RabbitMQ - 网络通讯设计,自定义应用层协议,实现 BrokerServer (8)
目录 一、网络通讯协议设计 1.1、交互模型 1.2、自定义应用层协议 1.2.1、请求和响应格式约定 编辑 1.2.2、参数说明 1.2.3、具体例子 1.2.4、特殊栗子 1.3、实现 BrokerServer 1.3.1、属性和构造 1.3.2、启动 BrokerServer 1.3.3、停止 BrokerServer 1.3.4、处…...
MongoDB入门
简介 MongoDB是一个开源、高性能、支持海量数据存储的文档型数据库 是NoSQL数据库产品中的一种,是最像关系型数据库(MySQL)的非关系型数据库 内部采用BSON(二进制JSON)格式来存储数据,并支持水平扩展。 MongoDB本身并不是完全免费的,它对于…...
vr智慧党建主题展厅赋予企业数字化内涵
现如今,VR全景技术的发展让我们动动手指就能在线上参观博物馆、纪念馆,不仅不用受时间和空间的限制,还能拥有身临其境般的体验,使得我们足不出户就能随时随地学习、传承红色文化。 很多党建展厅都是比较传统的,没有运用…...
go中mutex的sema信号量是什么?
先看下go的sync.mutex是什么 type Mutex struct {state int32sema uint32 } 这里面有个sema,这个就是信号量。 什么是信号量? 什么是信号量?_kina100的博客-CSDN博客 其实通俗的来说,信号量就是信号灯,但是他不是…...
LeetCode笔记:Weekly Contest 360
LeetCode笔记:Weekly Contest 360 0. 吐槽1. 题目一 1. 解题思路2. 代码实现 2. 题目二 1. 解题思路2. 代码实现 3. 题目三 1. 解题思路2. 代码实现 4. 题目四 1. 解题思路2. 代码实现 比赛链接:https://leetcode.com/contest/weekly-contest-360/ 0.…...
【树DP】2021ICPC南京 H
Problem - H - Codeforces 题意: 思路: 这题应该算是铜牌题 铜牌题 简单算法 基础思维 简单复盘一下思路 首先,我们发现有个很特殊的条件: ti < 3 然后看一下样例: 注意到,对于一个结点 u &#…...
Leedcode19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 示例 2: 输入:head [1], n 1 输出:[] 示例 3: 输入࿱…...
Mysql-索引查询相关
一、单表查询 1.1 二级索引为null 不论是普通的二级索引,还是唯一二级索引,它们的索引列对包含 NULL 值的数量并不限制,所以我们采用key IS NULL 这种形式的搜索条件最多只能使用 ref 的访问方法,而不是 const 的访问方法 1.2 c…...
C++ Pimpl
Pimpl(Pointer to implementation,指向实现的指针) 是一种减少代码依赖和编译时间的C编程技巧,其基本思想是将一个外部可见类(visible class)的实现细节(一般是所有私有的非虚成员)放在一个单独的实现类(implementation class)中&…...
rust学习-类型转换
基本类型转换 // 不显示类型转换产生的溢出警告。 #![allow(overflowing_literals)]fn main() {let decimal 65.4321_f32;// 错误!不提供隐式转换// let integer: u8 decimal;// 可以显式转换let integer decimal as u8;let character integer as char;println…...
算法通过村第四关-栈青铜笔记|手写栈操作
文章目录 前言1. 栈的基础概要1.1 栈的特征1.2 栈的操作1.3 Java中的栈 2. 栈的实现(手写栈)2.1 基于数组实现2.2 基于链表实现2.3 基于LinkedList实现 总结 前言 提示:我自己一个人的感觉很好 我并不想要拥有你 除非你比我的独处更加宜人 --…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
