java 数据结构LinkedList类
目录
什么是LinkedList
链表的概念及结构
链表的结构
无头单向非循环链表
addFirst方法(头插法)
addLast方法(尾插法)
addIndex方法
contains方法
removeAllKey方法
size和clear方法
链表oj题
无头双向非循环链表
addFirst方法(头插法)
addLast方法(尾插法)
addIndex方法
contains方法
removeAllKey方法
clear方法
什么是LinkedList

链表的概念及结构

链表的结构
无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多
无头双向非循环链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表
图中是单向不带头非循环,一整个框代表一个节点就是node
带头的单向非循环,头(head)相当于司机,不能在前面插入
带头的单向循环
总结:
单向:一直往后走,直到走到head==null
双向:可往后走可往回走,多一个域,后一个存前一个的地址,前一个存的null
带头:前面不可插,head不会变
不带头:前面可插,head会变
循环:循环完回到头(head)
无头单向非循环链表
链表的节点由两个域组成,一个是val域,一个是next域,图中的是无头单向非循环链表,下面的
方法都是模拟底层的代码
遍历链表:
如何遍历链表呢?
首先每个节点的next域指向的都是下个节点的地址,我们先从第一个节点到第二个节点,
head=head.next,这时候head就来到图中的0x46这个节点了,以此类推,如何判断走完呢,
就是head==null,最后head指向空,以此为结束条件
遍历链表代码:
public void display() {ListNode cur = this.head;//把这个赋给cur,不然方法结束后会没有指向while (cur != null) {//因为最后一个next域里是nullSystem.out.print(cur.val + " ");//打印val域里的值cur = cur.next;//当前节点指向下一个节点的next,,}System.out.println();}
addFirst方法(头插法)
我们使用头插法在head的前面插入一个节点,这个叫头插法,就是把head给到你插入的节点
所以我们要创建一个节点,如下图所示,0x65就是我们创建的节点,一开始创建这个节点的时候
只有val值,它的next域是空的,要想把它放到第一个,我们得把它的next域存的是现在的head的
地址,然后我们在把head指向我们创建的节点,这就是我们的头插法。
头插法代码:
public void addFirst(int data) {ListNode node = new ListNode(data);if(this.head == null) {this.head = node;}else {node.next = this.head;this.head = node;}}
addLast方法(尾插法)
如果我们想要在最后一个节点后面插入一个节点,我们就要使用尾插法,尾插法很简单,我们
设置循环的条件,当我们遍历到head.next==null说明我们来到了最后一个节点,这时候把head的
next域存入你要插入节点的地址就行了。
尾插法代码:
public void addLast(int data) {ListNode node = new ListNode(data);ListNode cur = this.head;if(this.head == null) {this.head = node;}else {//找到尾巴while(cur.next != null) {cur = cur.next;}//cur 现在指向了最后一个节点cur.next = node;}}
addIndex方法
这个方法可以根据我们输入的下标以及输入的数字,插入到指定的下标,这时候我们要注意
如果你要插入下标为1的节点,它的前一个节点存的才是你下标为1的节点,你不能直接插下标为1
的节点,你得插入它的前一个节点,这样你才能变成下标为1的节点,所以我们需要创建一个节点
先让它的next域存的是你前一个节点的next域里的地址,然后让你前面节点的next域换成你插入
节点的地址。
具体代码:
代码中还考虑了会不会下标的问题以及当下标等于0和等于链表长度的情况
public void addIndex(int index, int data) {if(index < 0 || index > size()) {//抛自定义的异常return;}if(index == 0) {addFirst(data);return;}if(index == size()) {addLast(data);return;}ListNode cur = searchPrev(index);ListNode node = new ListNode(data);node.next = cur.next;cur.next = node;}private ListNode searchPrev(int index) {ListNode cur = this.head;int count = 0;while (count != index-1 ) {cur = cur.next;count++;}return cur;}
contains方法
这个方法很简单就是遍历你的链表,然后判断你的节点val值是不是等于实参传入的值具体实现看
如下代码。
public boolean contains(int key) {ListNode cur = this.head;while (cur != null) {if(cur.val == key) {return true;}cur = cur.next;}return false;}
remove方法
删除节点,我们只需要把你要删除数字的节点的前一个节点的next域存的是你要删除的那个数字的
节点的next域里的地址,如图所示,比如你要删除23这个数字,你把12节点的next域的地址改成
23节点next域里的地址就好了。
具体代码:
public void remove(int key) {if(this.head == null) {//一个节点都没有 无法删除!return;}if(this.head.val == key) {this.head = this.head.next;return;}//1. 找到前驱ListNode cur = findPrev(key);//2、判断返回值是否为空?if(cur == null) {System.out.println("没有你要删除的数字");return;}//3、删除ListNode del = cur.next;cur.next = del.next;}/*** 找到关键字key的前一个节点的地址* @param key* @return*/private ListNode findPrev(int key) {ListNode cur = this.head;while (cur.next != null) {if(cur.next.val == key) {return cur;}cur = cur.next;}return null;}
removeAllKey方法
我们创建一个prev节点来记录head,再创建一个cur节点记录head的下一个节点,然后如果循环
如果找到了要删除的值,让prev的next域存cur的next域里的地址,如果没找到,prev指向cur,
cur接着指向往下一个节点走。最后再判断是不是头节点是不是要删除的节点,看图配合代码思考
具体代码:
public void removeAllKey(int key) {if (this.head == null) {//一个节点都没有 无法删除!return;}ListNode cur = this.head;while (cur != null) {if (cur.next.val == key) {cur.next = cur.next.next;}cur = cur.next;}//如果头的val域的值就是key,把当前head指向下一个if (head.val == key) {head = head.next;}}
size和clear方法
size方法我们只需要设置一个变量来记录循环的次数,就是在遍历链表的基础上加个变量,clear
方法就设置一个节点存你要删除的当前的next域的地址,然后再把当前节点的next域设置为空,然
后循环到指向空停止,具体实现看代码。
public int size() {int count = 0;ListNode cur = this.head;while (cur != null) {count++;cur = cur.next;}return count;}public void clear() {ListNode cur = head;while (cur != null) {ListNode curNext = cur.next;//cur.val = null;cur.next = null;cur = curNext;}head = null;}
链表oj题
下面的代码我都是在idea上写的,在leetcode里记得修改
1. 删除链表中等于给定值 val 的所有节点
https://leetcode.cn/problems/remove-linked-list-elements/description/
代码:
public void removeAllKey(int key) {if(this.head == null) {return;}ListNode prev = head;ListNode cur = head.next;while (cur != null) {if(cur.val == key) {prev.next = cur.next;cur = cur.next;}else {prev = cur;cur = cur.next;}}if (head.val == key) {head = head.next;}}
2. 反转一个单链表
https://leetcode.cn/problems/reverse-linked-list/description/
代码:
public ListNode reverseList() {if(head == null) {return null;}//只有一个节点if(head.next == null) {return head;}ListNode cur = head.next;head.next = null;while (cur != null) {ListNode curNext = cur.next;cur.next = head;head = cur;cur = curNext;}return head;}
3. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点
https://leetcode.cn/problems/middle-of-the-linked-list/description/
代码:
public ListNode middleNode2() {ListNode fast = head;ListNode slow = head;while (fast != null && fast.next != null){fast = fast.next.next;slow = slow.next;}return slow;}
4. 输入一个链表,输出该链表中倒数第k个结点
https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&&tqId=11167&rp=2&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking
代码:
public ListNode findKthToTail(int k) {if(k <= 0 || head == null ) {return null;}ListNode fast = head;ListNode slow = head;int count = 0;while (k-1 != count) {fast = fast.next;//处理 K 太大的问题if(fast == null) {return null;}count++;}while (fast.next != null) {fast = fast.next;slow = slow.next;}return slow;}
5. 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的
https://leetcode.cn/problems/merge-two-sorted-lists/description/
代码:
public ListNode mergeTwoLists(ListNode head1, ListNode head2) {ListNode newH = new ListNode(0);ListNode tempH = newH;while (head1 != null && head2 != null) {if (head1.val < head2.val) {tempH.next = head1;head1 = head1.next;} else {tempH.next = head2;head2 = head2.next;}tempH = tempH.next;}if (head1 != null) {tempH.next = head1;}if (head2 != null) {tempH.next = head2;}return newH.next;}
7. 链表的回文结构
https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId=49&&tqId=29370&rp=1&ru=/activity/oj&qru=/ta/2016test/question-ranking
代码:
public boolean chkPalindrome() {if(head == null || head.next == null) {return true;}// write code hereListNode fast = head;ListNode slow = head;//1、找到中间位置while (fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;}//2、翻转ListNode cur = slow.next;while (cur != null) {ListNode curNext = cur.next;cur.next = slow;slow = cur;cur = curNext;}//3、从前到后 从后到前while (head != slow) {if(head.val != slow.val) {return false;}if(head.next == slow) {return true;}head = head.next;slow = slow.next;}return true;}
6. 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70?tpId=8&&tqId=11004&rp=2&ru=/activity/oj&qru=/ta/cracking-the-coding-interview/question-ranking
代码:
public ListNode partition(ListNode pHead, int x) {// write code hereif(pHead == null) {return null;}ListNode bs = null;ListNode be = null;ListNode as = null;ListNode ae = null;ListNode cur = pHead;while(cur != null) {if(cur.val < x) {if(bs == null) {//插入第一个节点bs = cur;be = cur;}else {be.next = cur;be = be.next;}}else {if(as == null) {as = cur;ae = cur;}else {ae.next= cur;ae = ae.next;}}cur = cur.next;}//开始串起来if(bs == null) {//第一个区间没有数据return as;}//第一个区间有数据be.next = as;if(as != null) {//第2个区间有数据ae.next = null;}return bs;}
8. 输入两个链表,找出它们的第一个公共结点
https://leetcode.cn/problems/intersection-of-two-linked-lists/description/
代码:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode pl = headA;ListNode ps = headB;//1、求长度int lengthA = 0;while (pl != null) {lengthA++;pl = pl.next;}int lengthB = 0;while (ps != null) {lengthB++;ps = ps.next;}pl = headA;ps = headB;int len = lengthA - lengthB;if (len < 0) {//如果长度为负,说明后面那个长度大//修正一下 pl和ps的指向pl = headB;ps = headA;len = lengthB - lengthA;//把长度弄正的}//代码执行到这里// 1. pl一定指向最长的链表,ps一定指向最短的链表 2. len一定是一个正数//2、走差值步while (len != 0) {//最长的走差值步pl = pl.next;len--;}//3、同时走 //4、相遇就是相遇点while (pl != ps) {pl = pl.next;ps = ps.next;if (pl == null) {return null;}}return pl;}
9. 给定一个链表,判断链表中是否有环
https://leetcode.cn/problems/linked-list-cycle/description/
代码:
public boolean hasCycle2(ListNode head) {ListNode fast = head;ListNode slow = head;while(fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;if(fast == slow) {break;}}if(fast == null || fast.next == null) {return false;}return true;}
10. 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL
https://leetcode.cn/problems/linked-list-cycle-ii/description/
代码:
public ListNode hasCycle3(ListNode head) {ListNode fast = head;ListNode slow = head;while (fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;if (fast == slow) {break;}}if (fast == null || fast.next == null) {return null;}slow = head;//slow从head出发,fast从相遇点出发,一人一步,走到最后就是入口点while (slow != fast) {fast = fast.next;slow = slow.next;}return slow;}
无头双向非循环链表
addFirst方法(头插法)
首先,我们先创建一个节点,然后我们把当前head的prev域存入你插入节点的地址,因为我们现
在的head的prev域里是空,为了保证他是双向循环,所以prev得设置一下,然后在把你新创建节
点的next域存入head的地址,最后再把head指向你插入的节点。看下图联想一下
具体代码:
public void addFirst(int data) {ListNode node = new ListNode(data);if(head == null) {head = node;last = node;}else {node.next = head;head.prev = node;head = node;}}
addLast方法(尾插法)
尾插法同样我们需要创建一个对象,我们只需要把last的next域存你插入节点的地址,然后把你插
入节点的prev域存你当前last的地址,最后再把last指向你插入的节点,想不通看下图。
具体代码:
public void addLast(int data) {ListNode node = new ListNode(data);if(head == null) {head = node;last = node;}else {last.next = node;node.prev = last;last = node;}}
addIndex方法
如图所示,我们可以让head先走,走到你要插入的下标,对比单向的它不需要停在你要插入下标
的前一个节点,因为在双向我们知道前一个节点的地址,先假设我们要插入下标为2的节点,然后
我们创建一个节点,,然后把它的next域存你要下标为2节点的地址,随后我们把下标为2的前一
个节点的地址改成你插入节点的地址,然后prev域存下标为2的prev域的地址,然后再把下标为2
的prev改成你插入节点的地址就好了。
具体代码:
public void addIndex(int index, int data) throws PosException {int len = size();//这样写size方法只用调用一次if (index < 0 || index > len) {throw new PosException("插入下标异常!");}if (index == 0) {addFirst(data);return;}if (index == len) {addLast(data);return;}ListNode cur = head;ListNode node = new ListNode(data);int count = 0;while (count != index) {count++;cur = cur.next;}node.next = cur;cur.prev.next = node;node.prev = cur.prev;cur.prev = node;}
contains方法
跟单向的一样的代码一样
public boolean contains(int key) {if (head == null) {return false;}ListNode cur = head;while (cur != null) {if (cur.val == key) {return true;}cur = cur.next;}return false;}
remove方法
双向的这个方法很复杂,需要考虑到很多方面,一步一步来,先最简单的就head停留在你要删除
的节点,然后把它的前一个节点的next域指向你要删除节点的next域的地址,然后还要把后一个数
字的prev域改成你要删除的数字前一个节点的地址。这是最简单的情况,然后就是如果是一开始
head节点的就是你要删除的节点的情况,我们先让head往下一个节点这样就删掉了,然后判断
这时候的head是不是指向空,如果是last也得为空,因为只有一个节点。然后如果是last节点是你
要删除都节点的情况,我们得让last的前一个节点的next域指向空,然后last指向前一个节点。然
后就是中间的情况,先让你要删除节点的前一个节点的next指向删除节点next域里的地址,然后让
它后一个节点的prev域存要删除节点的前一个节点的地址。想不通结合下图想想
具体代码:
public void remove(int key) {ListNode cur = head;while (cur != null) {if (cur.val == key) {if (cur == head) {//如果head的val等于keyhead = head.next;//head == nullif (head == null) {last = null;} else {//head到下个节点且不为空head.prev = null;}} else {cur.prev.next = cur.next;//中间等于keyif (cur == last) {//如果last的val等于keylast = last.prev;} else {cur.next.prev = cur.prev;}}return;} else {cur = cur.next;}}}
removeAllKey方法
跟remove几乎一样就是找到了要删除的节点还得继续往下走直到删除完所有要删除的
具体代码:
public void removeAllKey(int key) {ListNode cur = head;while (cur != null) {if (cur.val == key) {if (cur == head) {//如果head的val等于keyhead = head.next;//head == nullif (head == null) {last = null;} else {//head到下个节点且不为空head.prev = null;}} else {cur.prev.next = cur.next;//中间等于keyif (cur == last) {//如果last的val等于keylast = last.prev;} else {cur.next.prev = cur.prev;}}}cur = cur.next;}}
clear方法
跟单向的一样,多了一个就是让last也指向空
具体代码:
public void clear() {ListNode cur = head;while (cur != null) {ListNode curNext = cur.next;//cur.val = null;cur.prev = null;cur.next = null;cur = curNext;}head = null;last = null;}
相关文章:

java 数据结构LinkedList类
目录 什么是LinkedList 链表的概念及结构 链表的结构 无头单向非循环链表 addFirst方法(头插法) addLast方法(尾插法) addIndex方法 contains方法 removeAllKey方法 size和clear方法 链表oj题 无头双向非循环链表 ad…...

第五次作业(防御安全)
需求: 1.办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP 不能用来转换) 2.分公司设备可以通过总公司的移动链路和电信链路访问到DMZ区的http服务器 3.分公司内部的客户端可以通过公网地址访问到内部的服务…...

阿里云香港轻量应用服务器是什么线路?
阿里云香港轻量应用服务器是什么线路?不是cn2。 阿里云香港轻量服务器是cn2吗?香港轻量服务器不是cn2。阿腾云atengyun.com正好有一台阿里云轻量应用服务器,通过mtr traceroute测试了一下,最后一跳是202.97开头的ip,1…...

C# Winform .net6自绘的圆形进度条
using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms;namespace Net6_GeneralUiWinFrm {public class CircularProgressBar : Control{private int progress 0;private int borderWidth 20; // 增加的边框宽度public int Progr…...

Git基本操作(超详细)
文章目录 创建Git本地仓库配置Git配置命令查看是否配置成功重置配置 工作区、暂存区、版本库添加文件--场景一概述实例操作 查看.git文件添加文件--场景二修改文件版本回退撤销修改情况⼀:对于工作区的代码,还没有 add情况⼆:已经 add &#…...

【AGI视频】Sora的奇幻之旅:未来影视创作的无限可能
在五年后的未来,科技的发展为影视创作带来了翻天覆地的变化。其中,Sora视频生成软件成为了行业的翘楚,引领着全新的创作潮流。Sora基于先进的Transformer架构,将AI与人类的创造力完美结合,为观众带来了前所未有的视听盛…...

Docker部署nginx
搜索镜像 docker search nginx 下载拉取nginx镜像 docker pull nginx 查看镜像 docker images 启动容器 docker run -d --name nginx01 -p 3344:80 nginx 外部端口需要在服务器安全组中设置,使用docker镜像nginx以后台模式启动一个容器,并将容器…...
C++Qt——自定义信号与槽
自定义信号与槽 自定义信号与槽是实现对象间通信的一种机制,比如按钮和窗口间的通信。 一、定义信号 Signal关键字声明的类成员函数。不需要实现,只需要声明。 signals:void mySignals();//定义信号,不用实现二、定义槽 可以使任何普通成员函数&…...
提高项目的性能和响应速度的方法
目录 引言 一、代码优化 二、数据库优化 三、缓存技术: 四、异步处理 1. 将耗时的操作改为异步处理 1.1 文件上传 1.2 邮件发送 2. 使用消息队列实现异步处理 2.1 配置消息队列 2.2 发送消息 2.3 接收消息并处理 五、负载均衡和集群 1. 负载均衡 1.1 …...
QT学习事件
一、事件处理过程 众所周知 Qt 是一个基于 C 的框架,主要用来开发带窗口的应用程序(不带窗口的也行,但不是主流)。 我们使用的基于窗口的应用程序都是基于事件,其目的主要是用来实现回调(因为只有这样程序…...
第13章 网络 Page818 UDP(和TCP的比较)
TCP核心类 asio::ip::tcp::socket;//网络套接字 asio::ip::tcp::endpoint;//边接端地址 asio::ip::tcp::resolver;//地址解析器 asio::ip::tcp::acceptor;//连接接受器 UPD核心类 asio::ip::udp::socket;//网络套接字 asio::ip::udp::endpoint;//边接端地址 asio::ip::udp::…...

EMQX Enterprise 5.4 发布:OpenTelemetry 分布式追踪、OCPP 网关、Confluent 集成支持
EMQX Enterprise 5.4.0 版本已正式发布! 新版本提供 OpenTelemetry 分布式追踪与日志集成功能,新增了开放充电协议 OCPP 协议接入能力,并为数据集成添加了 Confluent 支持。此外,新版本还进行了多项改进以及 BUG 修复,…...
记录 | C++ cout.setf(ios::fixed)
cout.setf(ios::fixed); 是在 C 中使用的一个标准库函数,用于将流的输出格式设置为"fixed" "fixed"格式指定输出浮点数时,小数点后的位数是固定的。这意味着,无论输出的数字有多少位小数,小数点后都会保留相…...

Eclipse 创建 Hello World 工程
Eclipse 创建 Hello World 工程 1. Hello WorldReferences Download and install the Eclipse IDE. 1. Hello World Eclipse -> double click -> Launch 单击蓝色方框 (右上角) 最大化 IDE File -> New -> C Project -> Finish Project name:工程名…...
【前端工程化面试题】vite热更新原理
vite 在开发阶段,运行 vite 命令,会启动一个开发服务器,vite 在开发阶段是一个服务器 依赖 esm: vite 在开发阶段使用 esm 作为开发时的模块系统。esm 具有动态导入的能力,这使得在代码中引入模块时可以动态地加载新的…...
【leetcode】判断二叉树是否完全二叉树
递归方式判断二叉树是否完全二叉树 bool TreeComplete(TreeNode* root) {if (root ! NULL) {if (root->left NULL && root->right ! NULL) {return false; // 左子树空}else if (root->left NULL && root->right NULL) {return true; // 左右子…...
Java多线程系列——内存模型JMM
目录 核心思想 关键概念 1. 可见性 2. 原子性 3. 有序性 工作原理 并发工具类 对并发编程的影响 同步策略 JMM的实践意义 结语 Java内存模型(Java Memory Model, JMM)是Java并发编程中的核心概念,其定义了Java虚拟机(JV…...

深入理解 Vue3 中的 setup 函数
💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…...

【QT+QGIS跨平台编译】之三十六:【RasterLite2+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
文章目录 一、RasterLite2介绍二、文件下载三、文件分析四、pro文件五、编译实践一、RasterLite2介绍 RasterLite2是一个开源的轻量级栅格数据库,可以用于存储和管理各种类型的栅格数据,包括卫星遥感图像、数字高程模型等。 与传统的GIS数据存储方式不同,RasterLite2采用基…...
java面试题:分布式和微服务的区别
1 分布式和微服务概念不同 微服务架构是架构设计方式,是设计层面的东西,一般考虑如何将系统从逻辑上进行拆分,也就是垂直拆分。 分布式系统是部署层面的东西,即强调物理层面的组成,即系统的各子系统部署在不同计算机…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...

认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...