JavaDS —— 单链表 与 LinkedList
顺序表和链表区别
ArrayList :
底层使用连续的空间,可以随机访问某下标的元素,时间复杂度为O(1)
但是在插入和删除操作的时候,需要将该位置的后序元素整体往前或者向后移动,时间复杂度为O(N)
增容需要申请新空间,有时候需要拷贝数据释放旧空间,这会有不小的消耗。
顺序表的增容一般是2倍增加的,势必会有一定的kong’jian浪费,例如当前容量为100时,需要扩容的话,就是将容量增加到200,如果只是再插入几个数据,就一定会浪费九十几的空间。
既然如此,我们就会思考如何减少空间的浪费,这时候链表就登场了,下面是单链表的示意图:
链表由两个部分组成,一个是数据域,一个是指针域,数据域是用来存放数据的,指针域是用来存放下一个或者前一个的引用的,这样就把数据给串联起来了,大家也就不难发现,链表的优点就是用多少空间就申请多少空间,做到空间不浪费,并且在下面的内容,你还会感受到链表的插入删除操作效率很高。
链表的分类
链表有8大类,带头和不带头,单向还是双向,循环还是不循环,2^3 = 8种
带头和不带头是指链表有没有一个哨兵节点,就是只是充当头结点的作用,不存放任何有效的数据。
上面的图片就是不带头的,下面的是带头的:
单向和双向是指:链表的节点是只指向后一个节点的话就是单向的,如果链表的节点即指向前一个结点又指向后一个节点的话就是双向的。
循环和不循环是指链表是否头尾相连,如果头尾相连就是循环的,否则就是不循环的:
实现单链表
下面是自己写的IList接口,会被单链表拓展:
public interface IList {//头插法public void addFirst(int data);//尾插法public void addLast(int data);//任意位置插入,第一个数据节点为0号下标public void addIndex(int index,int data);//查找是否包含关键字key是否在单链表当中public boolean contains(int key);//删除第一次出现关键字为key的节点public void remove(int key);//删除所有值为key的节点public void removeAllKey(int key);//得到单链表的长度public int size();//清空链表public void clear();//打印链表public void display();
}
单链表的节点需要一个数据域和一个指针域,我们先来写一个静态内部类来构造节点类:
static class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val = val;}}
除此之外,我们还需要一个头指针来指向第一个节点:
public ListNode head;
打印
循环遍历链表,打印每一个节点的数据,这个方法有利于我们的测试:
@Overridepublic void display() {ListNode cur = head;while(cur != null) {System.out.print(cur.val + " ");cur = cur.next;}System.out.println();}
头插
在单链表的头部插入一个数据,我们需要将新头节点的next指向原先头部的节点,然后改变head的指向。
@Overridepublic void addFirst(int data) {ListNode node = new ListNode(data);node.next = head;head = node;}
尾插
循环遍历单链表找到尾节点,然后改变尾节点的指向即可。
这里要注意如果head为空的时候,直接赋值就可以了,不能直接使用null,会报空指针异常,所以在循环前面加多一个判断条件即可。
@Overridepublic void addLast(int data) {ListNode node = new ListNode(data);if(head == null) {head = node;return;}ListNode cur = head;while(cur.next != null) {cur = cur.next;}cur.next = node;}
求节点总个数
这个很简单,直接循环遍历即可。
@Overridepublic int size() {ListNode cur = head;int count = 0;while(cur != null) {cur = cur.next;count++;}return count;}
指定位置插入
先判断指定的位置有没有越界,和之前的顺序表是一样的,这里不赘述:
public class IndexException extends RuntimeException{public IndexException(String message) {super(message);}
}
private void checkIndexInAdd(int index) throws IndexException {if(index < 0 || index > size()) {throw new IndexException("下标范围不合法!");}}
我们要先找到index前一个结点,因为这个插入操作是对三个节点进行操作的,首先先把index的引用放入新结节点的next中,然后再把index前一个结点的next改成新结点的引用,这是一般情况,如果index == 0的话就是头插操作,为什么要做一个判断,因为我们得出的一般规律最后是cur.next = node,这是建立在新结点前面一定有结点的情况下,但是如果是头插的话就不符合了,所以头插需要单独说明。
@Overridepublic void addIndex(int index, int data) {try{checkIndexInAdd(index);if(index == 0) {addFirst(data);return;}//找到index前一个的节点ListNode cur = head;for (int i = 0; i < index - 1; i++) {cur = cur.next;}ListNode node = new ListNode(data);node.next = cur.next;cur.next = node;} catch (IndexException e) {System.out.println("index 不合法!");e.printStackTrace();}}
对于插入操作,我们要先处理后面的结点,避免后面的结点丢失。
contains
是否包含某个元素,直接遍历循环即可:
@Overridepublic boolean contains(int key) {ListNode cur = head;while(cur != null) {if(cur.val == key) {return true;}cur = cur.next;}return false;}
删除第一次出现的key
删除某个结点的时候,由于这是单链表,所以我们最好事先拿到删除节点的前一个结点,然后我们要考虑一些特殊的情况,如果这个链表为空就不需要删除,如果要删除的结点就是头结点,那么我们就需要改变头指针的指向,最后就是一般情况下,我们直接修改删除结点的前一个结点的 next 域 就可以了。
private ListNode findFrontNodeOfKey(int key) {ListNode cur = head;while(cur != null) {if(cur.next.val == key) {return cur;}cur = cur.next;}return null;}@Overridepublic void remove(int key) {//空链表if(head == null) {return;}//头删if(head.val == key) {head = head.next;return;}ListNode prev = findFrontNodeOfKey(key);if(prev == null) {return;//不存在key}ListNode del = prev.next;prev.next = del.next;}
删除所有出现的key
我们使用两个指针,一个从头结点开始,另一个从头结点的下一个结点开始遍历链表,当第二个指针遇到要删除的结点时,配合第一个指针完成此工作,然后prev不变,cur继续移动,如果没有遇到删除的结点,两个指针是一起继续向后运动。
要注意如果链表为空的话就直接return ,避免发生空指针异常
这时候大家一定知道还差一个结点没有判断,就是第一个结点,所以我们最后还有判断一下头结点。
@Overridepublic void removeAllKey(int key) {if(head == null) {return;}ListNode prev = head;ListNode cur = head.next;while(cur != null) {if(cur.val == key) {prev.next = cur.next;} else {prev = cur;}cur = cur.next;}if(head.val == key) {head = head.next;}}
clear
清空链表,你可以直接把头指针赋值为null,由于链表没有被引用,会被JVM自动回收,
@Overridepublic void clear() {ListNode cur = head;while(cur != null) {ListNode tmp = cur.next;cur.next = null;cur = tmp;}head = null;}
模拟实现LinkedList
LinkedList 是不带头,双向的,循环的链表
构建节点
双向的意味着有两个节点,一个指向前一个结点,一个指向后一个结点,还有一个头指针指向头节点,一个尾指针指向尾节点。
static class ListNode {public int val;public ListNode prev;public ListNode next;public ListNode(int val) {this.val = val;}}public ListNode head;public ListNode last;
打印
public void display() {ListNode cur = head;while(cur != null) {System.out.print(cur.val + " ");cur = cur.next;}System.out.println();}
头插
要注意如果头指针为null,意味着链表为空,尾指针自然也是null,链表为空的话,插入新数据要改变头尾指针的指向。
正常情况下是链表至少有一个结点,改变原先头节点的prev指向,新结点的next也要改变。
public void addFirst(int data) {ListNode node = new ListNode(data);if(head == null) {head = last = node;return;}head.prev = node;node.next = head;head = node;}
尾插
注意如果尾指针为null时,说明链表为空。和上面的头插一样,要单独讨论说明。
public void addLast(int data) {ListNode node = new ListNode(data);if(last == null) {head = last = node;}last.next = node;node.prev = last;last = node;}
求结点个数
public int size() {ListNode cur = head;int count = 0;while(cur != null) {count++;cur = cur.next;}return count;}
指定位置插入
先判断index是否合法,不合法还是和之前一样抛异常。
public class IndexOutOfBoundException extends RuntimeException {public IndexOutOfBoundException() {super();}public IndexOutOfBoundException(String message) {super(message);}
}
private void checkIndexInAdd(int index) throws IndexOutOfBoundException{if(index < 0 || index > size()) {throw new IndexOutOfBoundException("下标越界!!!");}}
我们先讨论一般情况,如果待插入的结点正好前后都是由结点的,那么我们需要修改三个结点的指针:
cur.prev.next = node;
node.prev = cur.prev;
node.next = cur;
cur.prev = node;
现在来注意特殊情况,如果index == 0时,就是头插,不管怎么样,头插就一定要改变头指针,所以要单独讨论。换一种思路,如果是头插的话,cur.prev = null ,所以 cur.prev.next 一定会报空指针异常。所以头插还是要单独讨论。
那如果是尾插呢?尾插意味着 cur == null ,还是和头插思考方式一样,尾节点一定要改变所以要单独讨论,还有cur.prev 一定会报空指针异常。
public void addIndex(int index,int data) {try {checkIndexInAdd(index);if(index == 0) {addFirst(data);return;}ListNode node = new ListNode(data);ListNode cur = head;for (int i = 0; i < index; i++) {cur = cur.next;}if(cur == null) {addLast(data);return;}cur.prev.next = node;node.prev = cur.prev;node.next = cur;cur.prev = node;} catch (IndexOutOfBoundException e) {e.printStackTrace();}}
remove
删除第一次出现关键字为key的节点
如果链表为空不能继续删除操作
如果删除头节点,就必须改变头指针,所以要单独说明
一般情况下,需要变动cur前后结点,自然会想到:cur.prev.next = cur.next; cur.next.prev = cur.prev;
那如果是尾删呢?上面两行代码只有前面一行还能继续用,由于是尾删,尾节点就要发生改变,所以last = cur.prev;
public void remove(int key) {if(head == null) {return;}if(head.val == key) {head = head.next;if(head != null) {head.prev = null;}return;}ListNode cur = head.next;while(cur != null) {if(cur.val == key) {cur.prev.next = cur.next;if(cur.next == null) {last = cur.prev;} else {cur.next.prev = cur.prev;}return;}cur = cur.next;}}
removeAllKey
删除所有值为key的节点
删除所有的key,上面我们写了删除第一次出现key的结点,这里把代码直接帮过来,删掉return就可以继续用,但是一定是对的吗?
前面的链表判空直接返回没有问题,但是头删的话就有问题了,假设头节点是你要删除的结点就意味着头指针要发生改变,那如果新的头节点又要发生改变呢?这里我们选择尽量不改变我们的祖传代码,把头删放在最后面去做即可。
public void removeAllKey(int key) {if(head == null) {return;}ListNode cur = head.next;while(cur != null) {if(cur.val == key) {cur.prev.next = cur.next;if(cur.next == null) {last = cur.prev;} else {cur.next.prev = cur.prev;}}cur = cur.next;}if(head.val == key) {head = head.next;if(head != null) {head.prev = null;}}}
contains
是否包含key这个元素
public boolean contains(int key) {ListNode cur = head;while(cur != null) {if(cur.val == key) {return true;}cur = cur.next;}return false;}
clear
你可以直接将head 和last都置为null,这样链表就会被JVM自动回收。
这里模仿源码的写法,源码是一个一个结点都置为null,最后头尾指针再置为null
public void clear() {ListNode cur = head;while(cur != null) {ListNode tmp = cur.next;cur.prev = null;cur.next = null;cur = tmp;}head = last = null;}
LinkedList 使用
Java集合类中给我们提供了LinkedList,这是一个无头双向循环链表,我们来看一下它里面的方法,方法名字和上面我们模拟实现的差不多。
LinkedList 的构造方法
第二个构造方法是可以传入一个对象,和之前ArrayList表示二维数组是一个意思。
LinkedList 的方法
要注意LinkedList和ArrayList 的subList是一样的原理,截取的list还是原来的对象list,只是范围不同,并没有创建新的对象。
add(默认尾插)
注意LinkedList的add方默认是尾插:
public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(1);list.add(2);list.add(3);System.out.println(list);}
addAll
尾插一个对象
public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(1);list.add(2);list.add(3);System.out.println(list);ArrayList<Integer> list1 = new ArrayList<>();list1.add(10);list1.add(20);list.addAll(list1);System.out.println(list);}
遍历链表
直接打印
LinkedList也是重写了toString 方法
public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(1);list.add(2);list.add(3);System.out.println(list);}
for 循环
public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(1);list.add(2);list.add(3);int size = list.size();for (int i = 0; i < size; i++) {System.out.print(list.get(i) + " ");}System.out.println();}
for each
public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(1);list.add(2);list.add(3);for(int x : list) {System.out.print(x + " ");}System.out.println();}
迭代器
ListIterator 是继承 Iterator 的,这两个都可以来遍历链表打印数据。
迭代器的使用可以类似下面的图:
while(it.hasNext())hasNext表示是否由下一个数据,通过next()方法打印下一个数据,之后 it 一直向后移动。
Iterator
public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(1);list.add(2);list.add(3);System.out.println("===== Iterator ====");Iterator<Integer> it = list.iterator();while (it.hasNext()) {System.out.print(it.next()+" ");}System.out.println();}
ListIterator
public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(1);list.add(2);list.add(3);ListIterator<Integer> lit = list.listIterator();while (lit.hasNext()) {System.out.print(lit.next()+" ");}System.out.println();}
ListIterator(逆向遍历)
public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(1);list.add(2);list.add(3);System.out.println("===== ListIterator ====");ListIterator<Integer> lit2 = list.listIterator(list.size());while (lit2.hasPrevious()) {System.out.print(lit2.previous()+" ");}System.out.println();}
listIterator(int n) ,可以指定从哪个下标开始遍历链表
ArrrayList 和 LinkedLisrt 的总结
配套练习:
http://t.csdnimg.cn/nmObG
相关文章:
![](https://i-blog.csdnimg.cn/direct/03197101d1e34eddaa05101569fdfa1e.png)
JavaDS —— 单链表 与 LinkedList
顺序表和链表区别 ArrayList : 底层使用连续的空间,可以随机访问某下标的元素,时间复杂度为O(1) 但是在插入和删除操作的时候,需要将该位置的后序元素整体往前或者向后移动,时间复杂度为O&…...
![](https://www.ngui.cc/images/no-images.jpg)
LangChain —— Message —— how to filter messages
文章目录 一、概述二、基本使用三、连成链 一、概述 在更复杂的链和代理中,我们可能会使用消息列表跟踪状态。此列表可以开始累积来自多个不同模型、说话者、子链等的消息,我们可能只想将此完整消息列表的子集传递给链/代理中的每个模型调用。 filter_me…...
![](https://i-blog.csdnimg.cn/direct/1af262fcc80a4e4c903c636aca8857a2.png)
conda install问题记录
最近想用代码处理sar数据,解放双手。 看重了isce这个处理平台,在安装包的时候遇到了一些问题。 这一步持续了非常久,然后我就果断ctrlc了 后面再次进行尝试,出现一大串报错,不知道是不是依赖项的问题 后面看到说mam…...
![](https://www.ngui.cc/images/no-images.jpg)
【python】IPython的使用技巧
IPython使用技巧 一、魔法命令 %timeit 用途:用于测量一段代码的执行时间,这对于评估代码的性能非常有帮助,尤其适用于需要进行性能优化和比较不同实现方式效率的场景。示例:%timeit [x**2 for x in range(1000)]扩展…...
![](https://www.ngui.cc/images/no-images.jpg)
常用知识点问答
kafka如何部署? 先说明kafka的版本如果是 2.X 版本,则要先部署 3或5 个服务器的zookeeper集群,然后在每个zookeeper服务器上部署kafka应用。如果是 3.X 版本,kafka不再依赖zookeeper,所以可以直接在java17的环境上部署…...
![](https://www.ngui.cc/images/no-images.jpg)
paddlenlp cpu windows 下测试gpt
paddlenlp 安装python3.11版本 conda create -n python311 python3.11 激活python conda activate python311 安装paddlepaddle conda install paddlepaddle3.0.0b0 -c paddle pip install paddlenlp3.0.0b0 -U -i https://pypi.tuna.tsinghua.edu.cn/simple windows下…...
![](https://www.ngui.cc/images/no-images.jpg)
uboot的功能
uboot裸机程序,uboot的核心功能是启动内核 uboot启动流程 XIP设备: 1、硬件初始化 2、读flash上面的内核,拷贝进内存 3、启动内核 非XIP设备 1、BROM程序拷贝uboot到RAM 2、执行uboot 3、硬件初始化 4、读flash上面的内核,拷贝进…...
![](https://www.ngui.cc/images/no-images.jpg)
java导出word实现
参考:Poi-tl Documentation...
![](https://i-blog.csdnimg.cn/direct/8ad93461beb149499c80c9e563665b58.png)
Flink 提交作业的方式
首先我进行了flink单机部署,个人建议不管是学习还是开发尽量不使用 然后开始了flink自带集群部署,部署在三台服务器上,资源管理由flink集群自己管理,然后为了解决集群的单点故障问题,使用zookeeper监听事件࿰…...
![](https://i-blog.csdnimg.cn/direct/207573090cb64547bb2117e7ec2f39fe.png#pic_center)
JVM系列 | 垃圾收集算法
JVM系列 | 垃圾收集算法 文章目录 前言如何判断对象已"死"?引用计数法可达性分析算法可达性分析2.0版 | 引用的增强对象的消亡过程回收方法区主要回收目标:回收操作 垃圾收集算法分代收集理论 与 跨代引用假说分代收集理论跨带引用假说 垃圾收…...
![](https://www.ngui.cc/images/no-images.jpg)
深入理解Spring Boot中的事件驱动架构
深入理解Spring Boot中的事件驱动架构 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. 引言 事件驱动架构在现代软件开发中越来越受欢迎,它能够提高系统的松耦合性和可扩展性。Sprin…...
![](https://i-blog.csdnimg.cn/direct/8f0b045a4cbb43e9aa2333e5c34a294c.png)
Moldflow安装包下载:附网盘地址+详细教程步骤
如大家所了解的,Autodesk Moldflow仿真软件具有注塑成型仿真工具,能够帮助您验证和优化塑料零件、注塑模具和注塑成型流程。目前常用的版本有Moldflow 2019和Moldflow2023。 还没有获取Moldflow软件安装包资源的小伙伴,可以用百度云盘保存或下…...
![](https://img-blog.csdnimg.cn/img_convert/b4abe201fc6e7057baa67010cf473d35.webp?x-oss-process=image/format,png)
2024辽宁省数学建模B题【钢铁产品质量优化】思路详解
2024 辽宁省大学数学建模竞赛试题 B 题 钢铁产品质量优化 由于连续退火工序中各阶段的工艺参数之间存在耦合性(加热炉的温度设定会影响后续均热与冷却温度的设定,以及带钢穿行速度),导致难以建立该工序的机理模型,从而…...
![](https://i-blog.csdnimg.cn/direct/084b335694004f09b1f78f65b7d14b25.png)
C++基础入门(上)
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 C基础入门(上) 收录于专栏【C语法基础】 本专栏旨在分享学习C的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. C发展历史 2. C版本…...
![](https://www.ngui.cc/images/no-images.jpg)
基于深度学习的情感分析
基于深度学习的情感分析是一种利用深度学习技术从文本数据中提取情感信息,判断文本的情感倾向(如正面、负面或中性)的方法。这项技术在市场营销、客户服务、社交媒体分析、产品评价和政治分析等领域有广泛应用。以下是对这一领域的系统介绍&a…...
![](https://i-blog.csdnimg.cn/direct/a24f7df98e884048a87a01633109ec61.png)
mybatis 延迟加载
MyBatis的延迟加载(Lazy Loading)是一种优化技术,用于在需要时才加载关联对象或集合,从而提高性能和效率。以下是对MyBatis延迟加载的详细介绍: 延迟加载的基本概念 延迟加载是指在第一次访问对象的属性时才加载该对象…...
![](https://i-blog.csdnimg.cn/direct/7d4dfc74fac448c69520f1e2e1c96214.jpeg)
使用QT5.14.2开发族谱管理软件过程记录
目标缘由:出生在农村、学习了电脑技术,总有一个想法就是将老家传承下来的族谱录入电脑中,方便快速查询和长期保存。开始入手时候发现还挺有难度。 难点如下: 过去族谱纸质版书籍是民国时候印刷的、很多字都是繁体字、还有好些字…...
![](https://img-blog.csdnimg.cn/direct/49b51e1a6b6b4e55959d09a86faf6bd7.png)
【QT】布局管理器
布局管理器 布局管理器1. 垂直布局2. 水平布局3. 网格布局4. 表单布局5. Spacer 布局管理器 之前使⽤ Qt 在界⾯上创建的控件, 都是通过 “绝对定位” 的⽅式来设定的;也就是每个控件所在的位置, 都需要计算坐标, 最终通过 setGeometry 或者 move ⽅式摆放过去。 …...
![](https://www.ngui.cc/images/no-images.jpg)
兼容问题---ios底部的安全距离css设置
在H5上适配安全区域:采用viewportenvconstant方案。 具体操作如下: 1. 需要将viewport设置为cover,env和constant才能生效。设置代码如下: <meta name"viewport" content"widthdevice-width,initial-scale1.…...
![](https://www.ngui.cc/images/no-images.jpg)
python JSON Lines (JSONL)的保存和读取;jsonl的数据保存和读取,大模型prompt文件保存常用格式
1. JSON Lines (JSONL)文件保存 将一个包含多个字典的列表保存为 JSON Lines (JSONL) 格式的文件,每个字典对应一个 JSONL 文件中的一行。以下是如何实现这一操作的 Python 代码 import json# 定义包含字典的列表 data [{"id": 1, "name": &qu…...
![](https://img-blog.csdnimg.cn/direct/d6fca21f29ee456bb538271df7966236.gif#pic_center)
Spring Boot中@Async注解的使用及原理 + 常见问题及解决方案
😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…...
![](https://i-blog.csdnimg.cn/direct/10e40649c78849d5b1afe373c43d7782.png)
ubuntu基于cmakelist的Qt工程,如何将图片打包进二进制程序
qt界面使用的图片打包进入二进制可执行程序,可以避免发布的软件,因为路径问题无法加载图片的问题。 以下步骤参考自百度AI. 步骤如下: 1.创建一个新的Qt资源文件(.qrc文件) 2.在*.qrc文件中添加图片路径 qrc文件使用…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring的启动流程refresh方法、配置类解析流程@Component、@Configuration、@Import、@Bean
Spring的启动流程概述: 核心方法: refresh方法,作用就是实例化spring容器中的所有单例。 3步: 生成BeanFactory容器(有beanDefinition类信息和bean对象实例)生成BeanDefinition类信息生成bean对象实例 需…...
![](https://i-blog.csdnimg.cn/direct/5ba0618be76d4eea8a9ae20387f5c29a.png)
运算放大器(2)
(1)反向放大器 Vout(-R2/R1)*Vi 图一运放的同向端接地0V,反向端和同向端虚短,所以也是0V 反向输入端输入电阻很高,虚断,几乎没有电流注入和流出,那么R1和R2相当于是串联的,流过一个…...
![](https://img-blog.csdnimg.cn/img_convert/0afc63eecb76efd4b9e13c033185acf8.png)
智能优化算法之模拟退火算法SA
发展历史和算法思想 模拟退火算法(Simulated Annealing, SA)是一种基于热力学原理的随机优化算法,最早由 S. Kirkpatrick, C. D. Gelatt 和 M. P. Vecchi 于 1983 年提出。算法的灵感来自于固体物理学中的退火过程:通过加热和缓慢…...
![](https://i-blog.csdnimg.cn/direct/cc2083a8f7bc4514864c74ce11fb1c55.png)
同时用到,网页,java程序,数据库的web小应用
具体实现功能:通过网页传输添加用户的请求,需要通过JDBC来向 MySql 添加一个用户数据 第一步,部署所有需要用到的工具 IDEA(2021.1),Tomcat(9),谷歌浏览器,MySql,jdk(17) 第二步,创建java项目,提前部署数…...
![](https://img-blog.csdnimg.cn/img_convert/f6e0e5f8d6244c58eafe50a2f783f77e.jpeg)
星环科技推出语料开发工具TCS,重塑语料管理与应用新纪元
5月30-31日,2024向星力未来数据技术峰会期间,星环科技推出一款创新的语料开发工具——星环语料开发工具TCS(Transwarp Corpus Studio),旨在通过全面的语料生命周期管理,极大提升语料开发效率,助…...
![](https://i-blog.csdnimg.cn/direct/1b7ec5d13f6b4ffca736bda44a2943f1.png)
【ARM】MDK安装ARM_compiler5无法打开安装程序
【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 在客户安装了最新版本的MDK5.37及后续更新版本,但原工程使用ARM_Compiler_5.06进行编译和调试,需安装ARM_Compiler_5.06的编译器版本,但在解压缩的过程中后续无法打开ARM_Compiler…...
![](https://www.ngui.cc/images/no-images.jpg)
PHP文字ocr识别接口示例、人工智能的发展
全球在人工智能升级的大背景下,有一定规模的制造商开始大量部署人工智能机器人、系统,以此取代危险、简单和重复性的工作。各种人工智能技术的迅猛发展,正在驱动各行业就业市场发现变革。 京东物流大家并不陌生,京东快递机器人在…...
![](https://www.ngui.cc/images/no-images.jpg)
【2024 全国青少年信息素养大赛复赛指南】算法创意实践挑战赛复赛、智能算法应用挑战赛复赛指南
目录 2024 全国青少年信息素养大赛算法创意实践挑战赛复赛指南 一、比赛内容 二、编程题作答说明 三、准备说明 四、进入复赛 五、设备检测 六、答题与交卷 全国青少年信息素养大赛智能算法应用挑战赛复赛指南 一、 比赛规则: 二、学生具体操作流程 三、 评判方法…...
![](https://img-blog.csdnimg.cn/20201024113959487.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDc3NDI1NQ==,size_16,color_FFFFFF,t_70#pic_center)
源码下载网站/太原网站建设
学习参考借鉴 前言Feature scaling(特征缩放),常见的提法有“特征归一化”、“标准化”,是数据预处理中的重要技术,有时甚至决定了算法能不能work以及work得好不好。谈到feature scaling的必要性,最常用的2…...
![](/images/no-images.jpg)
唐山网站建设哪家优惠/google搜索引擎入口网址
原文发布时间为:2008-12-08 —— 来源于本人的百度文章 [由搬家工具导入]http://u.youku.com/user_video/uid_happyboy27.html优酷网。。转载于:https://www.cnblogs.com/handboy/p/7148493.html...
![](/images/no-images.jpg)
做网站找那个公司/淄博网站推广
def test():for i in range(4):yield i ttest() t1(i for i in t) #t1 就是把t这个生成器再次用表达式生成t1生成器 def test():for i in range(4):yield i ttest() #这个生成器里还没有值 只有执行了里面才有值 不next就没值for i in t:print(i)t1(i for i in t) print…...
![](https://img-blog.csdnimg.cn/20200130193951864.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzQ1MTYxNzY2,size_16,color_FFFFFF,t_70)
做那个网站的小编比较好/域名查询系统
利用代码来记录当前时间值或求某步操作所用时间值,本例以执行图片像素改变为例! 代码如下: import cv2 as cv #导入openc包 import numpy as np #科学计数的包def access_pixels(image): #获取图片像素的函数print(image.shap…...
![](https://img-blog.csdnimg.cn/20200607111803397.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z0aW1lcw==,size_16,color_FFFFFF,t_70)
网站设计开发软件有哪些/新闻稿在线
QT怎么自动一次性修改、替换程序中所有变量名? 熟悉的编译器都有这个功能, 初学QT,搜索无果,找了一会儿,分析给大家。 最直接的办法:选中变量名,CtrlShiftr ,变成红色之后即可更改。. 选中变…...
贵阳网站建设培训班/深圳做网站的公司有哪些
点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达上一篇:这300G的Java资料是我师傅当年给我的,免费分享给大家下一篇:这200G的Java实战资料是我师傅当年教我的第二招作者:fuzhongmin05http://tin…...