02、数据结构与算法--顺序表
开始正式了解结构...一、顺序表的理解顺序表是一种线性表它用一段地址连续的存储单元依次存储线性表的数据元素比喻电影院座位把顺序表想象成电影院里一排连续的座位连续存储这些座位是紧挨着的一个接一个拥有固定的座位号如1排1座、1排2座...。这就是“顺序”的含义——数据在物理内存中是连续存储的快速“按号找座”如果你想找第5个座位上坐的是谁你可以立刻计算出来并直接走过去“插队”与“离场”麻烦插入如果这排座位已经坐满了你想在中间加一个人那么从这个位置开始以后的所有人都需要向后移动一个位置才能空出一个新的座位删除同理如果中间有一个人离开了那么他后面的所有人都需要向前移动一个位置来填补空位以保持座位的连续性总结注意指定位置插入的add与remove方法1、一个自己实现的顺序表package structure; public interface IList { //新增元素,默认在数组最后插入 void add(int data); //在 pos 位置插入新增元素 void add(int pos, int data); //判定是否包含某个元素 boolean contains(int toFind); //查找某个元素对应的位置 int indexOf(int toFind); //获取 pos 位置的元素 int get(int pos); //给 pos 位置的元素设为 value void set(int pos, int value); //删除第一次出现的关键字key void remove(int toRemove); //获取顺序表长度 int size(); //清空顺序表 void clear(); //打印顺序表,该方法并不是顺序表中的方法,是方便看测试结果给出的 void display(); //空的还是满的 boolean isFull(); boolean isEmpty(); }package structure; import loose.ListEmptyException; import java.lang.management.MemoryManagerMXBean; import java.util.ArrayList; import java.util.Arrays; import java.util.EmptyStackException; public class MarryList implements IList { private int[] array; //私有的只在类内部调用 //静态的所有创建的对象共享不用反复创建占用内存 //常量的规定常量不变命名采用“全大写下划线” //代表默认数组容量 private static final int DEFAULT_CAPACITY 5; //数组元素个数 private int count 0; public MarryList(){ array new int[DEFAULT_CAPACITY]; } //自己实现的方法并进行了封装不希望外部调用 //数组扩容 private void grow(){ if(isFull()){ array Arrays.copyOf(array,array.length*2); } } //检查pos位置合法性 private void checkPos(int pos){ if(pos 0 || pos count){ throw new OutBoundException(pos位置不合法: pos pos); } } Override public void add(int data) { grow(); array[count] data; // array[count] data; // count; } //在指定pos位置插入元素 Override public void add(int pos, int data) { grow(); checkPos(pos); //从最后一个元素位置开始数据依次前移 //直到插入位置pos(包括pos)时停止 for (int i count-1; i pos; i--) { array[i1] array[i]; } array[pos] data; //最后别忘了更新元素个数 count; } Override public boolean contains(int toFind) { for (int i 0; i count; i) { if(array[i] toFind){ return true; } } return false; } Override public int indexOf(int toFind) { for (int i 0; i count; i) { if (array[i] toFind){ return i; } } return -1; } Override public int get(int pos) { //先验证数组是不是空的再检查位置合法性 if (isEmpty()) { throw new ListEmptyException(数组是空的); } checkPos(pos); return array[pos]; } Override public void set(int pos, int value) { checkPos(pos); array[pos] value; } Override public void remove(int toRemove) { int s indexOf(toRemove); if (s -1){ System.out.println(没有要删除的元素); //别忘了return防止继续往下执行 return; } //注意这里跟add的区别 for (int i s; i count - 1 ; i) { array[i] array[i1]; } //别忘了最后减一个元素 count--; } Override public int size() { return count; } Override public void clear() { //让如果是引用类型需要一个个遍历并给它们设置成null // for (int i 0; i count; i) { // array[i] null; // } count 0; } Override public void display() { for (int i 0; i count; i) { System.out.print(array[i] ); } System.out.println(); } Override public boolean isFull() { return array.length count; } Override public boolean isEmpty() { return count 0; } //endregion public static void main(String[] args) { MarryList m new MarryList(); m.add(1); m.add(2); m.add(3); m.add(4); m.add(5); m.add(99); m.display(); } }package structure; public class OutBoundException extends RuntimeException{ public OutBoundException(String message) { super(message); } }自己实现过后有助于更好的理解顺序表有助于后面使用ArrayList2、对于add与remove移动方向的着重分析add的在指定位置pos增添元素如图所示array[i1] array[i];remove删除元素如图所示array[i] array[i1];稍微注意一下这两个方法的区别即可二、两个ArrayList具体实现的题目118. 杨辉三角 - 力扣LeetCodeimport java.util.ArrayList; import java.util.List; //杨辉三角 public class java0823 { public static ListListInteger generate(int numRows){ List Integer list new ArrayList(); list.add(1); //设置顺序表第一行默认是个1 List ListInteger blank new ArrayList(); blank.add(list); for (int i 1; i numRows; i) { List Integer thisRow new ArrayList(); //每生成一行的更新 List Integer preRow blank.get(i-1); //表示上一行 thisRow.add(1); //一行的第一个元素默认是个1 for (int j 1; j i; j) { //[i][j] [i-1][j] [i-1][j-1]; int a preRow.get(j) preRow.get(j-1); thisRow.add(a); } //中间行的元素自己根据规律添加 thisRow.add(1); //一行的最后一个元素也默认是1 blank.add(thisRow); } return blank; } public static void main(String[] args) { System.out.println(generate(4)); System.out.println(generate(5)); } }

相关新闻

轻量级AI服务落地实战:Qwen2.5-0.5B-Instruct私有化部署与性能调优指南

轻量级AI服务落地实战:Qwen2.5-0.5B-Instruct私有化部署与性能调优指南

1. 从云端到本地:为什么我们需要私有化部署? 上次我们聊了怎么用官方镜像,在云平台上点几下鼠标就把Qwen2.5-0.5B-Instruct的网页服务跑起来,那感觉确实爽,五分钟搞定,开箱即用。但很多朋友用着用着&#x…

2026/5/17 11:27:39 阅读更多 →
GitHub Browser-Use 部署踩坑实录:从失败到成功的曲折历程

GitHub Browser-Use 部署踩坑实录:从失败到成功的曲折历程

1. 环境准备:从“万事开头难”到“地基打牢” 说实话,第一次看到 browser-use 这个项目的时候,我挺兴奋的。想想看,用自然语言告诉 AI “帮我查一下明天北京的天气,然后订一张最便宜的机票”,它就能自动打开…

2026/5/17 11:27:39 阅读更多 →
APN(Access Point Name)详解:从基础原理到实际应用场景

APN(Access Point Name)详解:从基础原理到实际应用场景

1. APN到底是什么?一个被忽略的“网络身份证” 你可能从来没注意过手机设置里那个叫“APN”的选项,但它却是你的手机能上网的“幕后功臣”。简单来说,APN就是“接入点名称”,它是你的手机和运营商网络之间沟通的“暗号”。每次你的…

2026/7/6 22:59:38 阅读更多 →

最新新闻

Ubuntu 22.04 实时监控:htop 与 top 的 5 项关键指标深度解析与实战

Ubuntu 22.04 实时监控:htop 与 top 的 5 项关键指标深度解析与实战

Ubuntu 22.04 实时监控:htop 与 top 的 5 项关键指标深度解析与实战当服务器负载突然飙升,或是应用程序响应变慢时,系统管理员的第一反应往往是打开终端查看资源占用情况。在 Ubuntu 22.04 中,top和htop这两个经典工具仍然是诊断性…

2026/7/6 23:59:07 阅读更多 →
msconfig 处理器个数设置详解:从1核到N核的3种应用场景与风险

msconfig 处理器个数设置详解:从1核到N核的3种应用场景与风险

msconfig处理器个数设置深度解析:从原理到实战的完整指南引言:揭开处理器个数设置的神秘面纱在Windows系统的众多隐藏功能中,msconfig中的"处理器个数"设置可能是最常被误解的一个。许多用户误以为这个选项能"开启"更多处…

2026/7/6 23:59:07 阅读更多 →
Java应用红蓝对抗实战:从反序列化漏洞到内存马注入的攻防剖析

Java应用红蓝对抗实战:从反序列化漏洞到内存马注入的攻防剖析

1. 项目概述:为什么Java安全是红蓝对抗的焦点在当前的网络安全攻防演练,也就是我们常说的红蓝对抗中,Java应用一直是双方交锋的核心战场。这不仅仅是因为Java在企业级应用、金融系统和大型互联网后台中无处不在,更因为其技术栈的复…

2026/7/6 23:59:07 阅读更多 →
RHEL 8.10 ISO 镜像下载与验证:3步完成官方订阅账户注册与SHA-256校验

RHEL 8.10 ISO 镜像下载与验证:3步完成官方订阅账户注册与SHA-256校验

RHEL 8.10官方镜像获取与安全验证全流程指南 1. 为什么选择官方渠道获取RHEL镜像? 在企业级Linux发行版中,Red Hat Enterprise Linux(RHEL)因其卓越的稳定性和长期支持而备受青睐。然而,许多技术人员在获取安装镜像时…

2026/7/6 23:57:01 阅读更多 →
Android进程监控攻防实战:从行为分析到恶意软件检测

Android进程监控攻防实战:从行为分析到恶意软件检测

1. 项目概述:当恶意软件开始“偷窥”你的进程在移动安全领域,Android进程(AndroidProcesses)的管理与监控一直是攻防双方的核心战场。对于普通开发者而言,/proc目录下的进程列表或许只是调试应用性能的工具&#xff1b…

2026/7/6 23:54:56 阅读更多 →
Node.js SQLite数据库加密实战:SQLCipher集成与安全存储指南

Node.js SQLite数据库加密实战:SQLCipher集成与安全存储指南

1. 项目概述:为什么我们需要加密的本地数据库?在开发桌面应用、移动端应用,甚至是某些需要离线存储敏感数据的服务端应用时,SQLite 几乎是默认的轻量级数据库选择。它简单、快速、零配置,一个文件就是一个数据库&#…

2026/7/6 23:50:52 阅读更多 →

日新闻

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻