当前位置: 首页 > news >正文

专题八_链表_算法专题详细总结

目录

链表

1.常用技巧

1)画图!!! ->  直观 + 形象 + 便于我们理解

2)引入虚拟“头”节点

1.便于处理边界条件

2.方便我们对链表进行操作

3.不要吝啬空间,大胆定义变量

4.快慢双指针

1.判断链表是否存在环

2.链表中的常用操作

1.创建一个新节点new

2.尾插

3.头插、

1. 两数相加(medium)

解析:

1)暴力:

2)优化:

总结:

2. 两两交换链表中的节点(medium)

解析:

1)暴力:

2)优化:

总结:

3. 重排链表(medium)

解析:

模拟:

第一步:eg:链表1->2->3->4->5

第二步:

第三步:

总结:

4. 合并 K 个升序链表(hard)

解析:

1)暴力:

2)优化:

1)大小堆:

2)分治_归并

步骤:

总结:

5. K个⼀组翻转链表(hard)

解析:

模拟:

那么这里就要补充一个狠狠狠重要的只是点了,三指针翻转链表:

总结:


链表

1.常用技巧

1)画图!!! ->  直观 + 形象 + 便于我们理解

2)引入虚拟“头”节点

1.便于处理边界条件

2.方便我们对链表进行操作

要考虑很多的边界条件

3.不要吝啬空间,大胆定义变量

4.快慢双指针

1.判断链表是否存在环

找到链表的入口

找到链表中倒数第n个节点

2.链表中的常用操作

1.创建一个新节点new
2.尾插

3.头插、

链表逆序,用头插贼方便,创建一个虚拟头节点,进行遍历就可以逆序。

那么就进入例题吧:

1. 两数相加(medium)

本题题意比较简单,意思就是两个已经被反转的链表只要直接相加即可,返回其相加后的链表,这里要注意的就是进位操作。

解析:

1)暴力:

我第一次做的时候,确实是个小白,什么都不会,将所有数字都存入字符串内,然后进行相加,也要考虑进位,或许将字符串转成int类型然后相加,在to_string()转成字符串也可以,但是这样太太太麻烦了。挺锻炼代码能力的,有兴趣可以试试。

2)优化:

在两个链表上设置移动指针cur1和cur2,然后设置进位next,在while里面判断cur1 和 cur2 是否为空,或者next是否存在进位,但凡有一个满足条件就能继续相加,添加到新链表的后端。这里注意的是,链表不一样长,那么就为了避免访问空指针的情况,就要先判断cur1==nullptr 和 cur2==nullptr,那么在这种情况下下,如果为空,就说明该链表已经遍历完,+0即可。

这里的进位需要注意的是先算出sum的总数,然后添加到链表的是sum%10 的余数,next表示进位,就让sum/10,证明存在进位的多少,让下一次链表相加就在加上这个进位。说到底熟能生巧,写多了,自然就会了。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode* head=new ListNode();ListNode* l=head;int next=0;while(l1||l2||next){int sum=(l1?l1->val:0)+(l2?l2->val:0)+next;head->next=new ListNode(sum%10);next=sum/10;if(l1) l1=l1->next;if(l2) l2=l2->next;head=head->next;}return l->next;}
};

总结:

两个链表相加考虑进位,其实是挺简单的链表操作,可以直接在原链表上操作,一定要想清楚再写代码,这样负担很小,不要直接上手就写,但凡有一点思路不清楚就去画图!!!

2. 两两交换链表中的节点(medium)

题意很简单,两两交换链表间的节点,比如【1,2】【3,4】【5,6】等等,没有重复的节点,那么就要考虑的是,交换之后,怎么有链接回原来的链表。

解析:

1)暴力:

就是创建新的链表,然后分奇偶添加,但是这题不让创建新的链表。

2)优化:

这题实质就是模拟,再原链表上进行交换,那么只需要考虑的是原链表上交换的节点,又要连接到原链表上,就是要创建新的指针指向节点,这样交换后就不会存在节点丢失的情况。

那么本题就是两个节点间的交换,实质就是创建三个指针指向两个节点和交换后要链接的原链表上的节点。设置prev=head ,now=head->next,next=now->next;

这里专门设置了一个虚拟头节点,是为了能让反转的链表重新连接回来,其实这里也可以选择设置四个指针,再指向next后面的一个节点。这样就可以无脑交换连接,是不是很简单。这里就是要注意的是不要吝啬空间,想创建指针就创建,这样不会存在找不到原链表的情况。

两两交换完后,那么这三个指针就再次往后移动,让prev移动到被交换后的最后一个节点,这样能保证prev再次充当虚拟头节点。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* swapPairs(ListNode* l) {ListNode* head=new ListNode();head->next=l;ListNode* prev=head;ListNode* now=head->next;ListNode* next=nullptr;if(now) next=now->next;ListNode* l1=head;while(now!=nullptr&&next!=nullptr){now->next=next->next;prev->next=next;next->next=now;prev=now;now=prev->next;if(now)next=now->next;}return l1->next;}
};

总结:

关于在原链表内进行交换节点,那么就要考虑三个指针的遍历指向链表上的节点,然后进行无脑交换就OK,这样不用担心创建的新链表不会链接不上的问题。

3. 重排链表(medium)

题意比较简单就是模拟问题,重新排列这个链表

解析:

模拟:

第一步:eg:链表1->2->3->4->5

当都设指针prev和cur开始从第一个节点开始走,让cur先手走两步,prev走一步,达到快慢指针的目的,就能证明在cur走到链表尽头的时候,prev正好在链表的中间节点。

那么此时就将链表分开,形成两段链表。

eg:链表1->2->3->4->5

形成:h1->1->2;

           h2->3->4->5;

第二步:

翻转h2->3->4->5;

       h2->5->4->3;

我这里单独创建了一个翻转链表的函数,还是比较简单的,利用头插法,新界一个头节点,然后进行头插,自然就反转了链表。

第三步:

然后模拟h1 和 h2 交换链接的过程,h->1->5->2->4->3,即可。

模拟两个链表相互交换的过程,合并两个链表,不用吝啬空间,直接上去每个链表创建虚拟头节点,然后进行交换相连,然后再将三个指针往前移动即可。直到最后若存在没有被遍历完的节点直接连接到最后即可。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:void reorderList(ListNode* l) {//将l分成两段链表//快慢双指针记录ListNode* cur=l,*prev=l;//prev停的位置就是链表的中点while(cur){cur=cur->next;if(cur) cur=cur->next;prev=prev->next;}cur=l;while(cur->next!=prev)cur=cur->next;cur->next=nullptr;//创建两个链表 h1,h2;ListNode* h1=new ListNode(),*h2=new ListNode();h1->next=l;h2->next=prev;ListNode* t=h1->next;while(t){cout<<t->val<<" ";t=t->next;}cout<<endl;ListNode* e=h2->next;while(e){cout<<e->val<<" ";e=e->next;}      cout<<endl;//翻转链表(头插法)h2=turnlist(h2);  e=h2->next;while(e){cout<<e->val<<" ";e=e->next;}      cout<<endl;//合并链表ListNode* r1=h1->next,*r2=nullptr; if(r1) r2=r1->next;ListNode* r3=h2->next,*r4=nullptr; if(r3) r4=r3->next;while(r1){r1->next=r3;r1=r2;if(r2)r2=r2->next;if(r3)r3->next=r1;r3=r4;if(r4)r4=r4->next;}}ListNode* turnlist(ListNode* h){ListNode* l1=h->next;ListNode* l=new ListNode();ListNode* l2=l;while(l1){ListNode* newnode=new ListNode(l1->val);newnode->next=l->next;l->next=newnode;l1=l1->next;}return l2;}};

总结:

这题确实很锻炼代码的模拟能力,十分推荐自己动手敲一遍。

4. 合并 K 个升序链表(hard)

题意很简单合并k个升序链表

解析:

1)暴力:

创建一个链表然后两两进行合并,每次两个链表都进行每个节点判断大小,小的添加到链表上,但是这样时间复杂度肯定很高,并且很麻烦,不过十分锻炼代码能力跟上题一样,有时间可以试试。

2)优化:

1)大小堆:

其实能想到用堆,优先级队列,这题是真简单,直接ac,属于秒杀题了,leetcode真是分不清,有些中等题难的要死。

这题如果用优先级队列,priority_queue(head->val),这里是大根堆,如果不进行翻转priority_queue(head->val,vector<int>,greater<int>) 小根堆的话,那么大根堆就进行头插,这样就可以保证完全有序,然后再插入新的链表,完成一个完整的新链表的创建。

总结:这里我之前用过set,虽然能排序,但会去重,我就又去multiset不会去重,但是每次删除的时候都会把所有相同的元素全都删除,那么唯一满足条件的就是优先级队列了priority_queue。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* mergeKLists(vector<ListNode*>& lists) {priority_queue<int> q;int n=lists.size();for(int i=0;i<n;i++){ListNode* cur=lists[i];while(cur){q.push(cur->val);cur=cur->next;}}ListNode* head=new ListNode();while(!q.empty()){ListNode* newnode=new ListNode(q.top());q.pop();newnode->next=head->next;head->next=newnode;}return head->next;}
};
2)分治_归并

这种思想就是让数组一直细分,一直细分到最后,然后向上进行归并,根上一个专题介绍的一模一样,代码模板简直都是一模一样的,一定要取尝试一下。

步骤:

1.传送区间范围,计算中间值

2.递归左右两边

3.一左一右,合并两个链表

4.进行合并

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* mergeKLists(vector<ListNode*>& lists) {return mergeSort(lists,0,lists.size()-1);}ListNode* mergeSort(vector<ListNode*>& lists,int left,int right){if(left>right) return 0;if(left==right) return lists[left];//计算中间值int mid=(left+right)>>1;//数组分两块【left,mid】 【mid+1,right】ListNode* l1=mergeSort(lists,left,mid);ListNode* l2=mergeSort(lists,mid+1,right);//合并两个链表return mergeTowlist(l1,l2);}ListNode* mergeTowlist(ListNode* l1,ListNode* l2){ListNode* head=new ListNode();ListNode* cur1=l1,*cur2=l2,*prev=head;while(cur1&&cur2){if(cur1->val<=cur2->val){prev=prev->next=cur1;cur1=cur1->next;}else {prev=prev->next=cur2;cur2=cur2->next;}}if(cur1) prev->next=cur1;if(cur2) prev->next=cur2;return head->next;}};

总结:

本题有很多种办法,这里两种优化的方法都推荐取试试,真的写的很爽。

5. K个⼀组翻转链表(hard)

题意很简单理解,就是不停的翻转k个节点

解析:

模拟:

其实这就是简单的模拟题,思想挺简单的,有点暴力内味hhh~

就是开头遍历节点个数,然后计算count得出要经过多少次循环,每次循环都进行k个节点的翻转就ok,真的挺简单的,那么主要就是进行链表的翻转,然后再重新接回来。

开始我想到挺简单的,创建新的链表,然后进行链接,就是采用头插法,本来挺成功的,就这里卡了我一个小时,各种调试都没过,最后还是去看题解了,才发现用头插法连接到原链表上居然失效了,只能再原链表上直接进行翻转。

那么这里就要补充一个狠狠狠重要的只是点了,三指针翻转链表:

三指针原链表反转:
步骤:
1.node=prev->next; 用node来记录当前节点的下一个节点,这样在反转后能够找到下一个节点
2.prev->next=head ; 让当前节点指向head,head就相当于一个标记节点 表示反转链表的头部
3.head=prev; 每次反转成功后,head都往后移动到prev的位置,重新表示反转链表的头部
4.prev->next=node; 然后进入下一轮反转,要prev再次表示当前节点,就重新指向node
 

那么每次传入区间内的链表的节点,只要实现这三指针,就可以完美的完成链表的原地翻转,妈妈再也不用担心浪费空间了~

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* chang(ListNode* prev, ListNode* cur)
{ListNode* node=nullptr,*head=nullptr;while(prev!=cur){node=prev->next;prev->next=head;head=prev;prev=node;}return head;
}ListNode* reverseKGroup(ListNode* l, int k) {ListNode* head = new ListNode();head->next = l;ListNode* cur = head->next, * prev = head;int n = 0;while (prev->next) prev = prev->next, n++;int count = n / k;prev = head;while (count--){ListNode* next = prev->next;for (int e = 0; e < k && cur != nullptr; e++) cur = cur->next;prev->next = chang(prev->next, cur);next->next = cur;prev = next;}return head->next;
}
};

总结:

这里最主要的就是关于在原链表上的直接翻转。哪怕用整整半天吃透我都觉得是值得的~

总结一下吧~这次的链表专题我学到了很多,希望也能帮到你!!!

相关文章:

专题八_链表_算法专题详细总结

目录 链表 1.常用技巧 1&#xff09;画图&#xff01;&#xff01;&#xff01; -> 直观 形象 便于我们理解 2&#xff09;引入虚拟“头”节点 1.便于处理边界条件 2.方便我们对链表进行操作 3.不要吝啬空间&#xff0c;大胆定义变量 4.快慢双指针 1.判断链表是否…...

Vue3使用vue-quill富文本编辑器实现图片大小调整

安装uill-image-resize npm install quill-image-resize --save在项目中导入并注册插件 import { QuillEditor, Quill } from vueup/vue-quill; import ImageUploader from quill-image-uploader; import ImageResize from quill-image-resize; //导入插件 import vueup/vue-…...

感知笔记1:ROS 视觉- 跟随红球

- 目录 - 如何在 ROS 中可视化 RGB 相机。如何作为机器人切换主题。如何创建 blob 检测器。如何获取要跟踪的颜色的颜色编码。如何使用 blob 检测数据并移动 RGB 相机以跟踪 blob。 机器人技术中最常见的传感器是不起眼的 RGB 摄像头。它用于从基本颜色跟踪&#xff08;blob 跟…...

JAVA多线程机制

JAVA多线程的实现 JAVA有两种方法创建线程 &#xff08;1&#xff09;继承Thread类 &#xff08;2&#xff09;实现Runnable接口 这两种方法都要用到Thread类以及相关方法 Thread类 是一个具体的类&#xff0c;不是抽象类&#xff0c;封装了线程的行为 利用Thread类创建一个…...

Element-plus安装及其基础组件使用

简而言之&#xff0c;在main.js中导出以下库,仅此&#xff0c;搞多了出错难排查 import ElementPlus from element-plus //导入ElementPlus 模块 import element-plus/dist/index.css //引入样式 app.use(ElementPlus) //注册库就能使用了 Element Plus 是一个基于 Vue 3 的组件…...

[产品管理-38]:创意、市场机会、商业可行性的区别

创意、市场机会和商业可行性在创业和商业活动中各自扮演着不同的角色&#xff0c;它们之间既有区别又相互联系。以下是对这三者区别的详细阐述&#xff1a; 产品创意&#xff1a;新颖打破常规、解决的实际问题、满足的客户需求 定义&#xff1a;创意是创造意识或创新意识的简…...

开源标注工具

DoTAT https://github.com/FXLP/MarkTool 后端代码未开放&#xff0c;可能有数据泄露风险 Chinese-Annotator https://github.com/deepwel/Chinese-Annotator 安装非常麻烦&#xff0c;github更新频率比较低&#xff0c;支持功能和doccano类似 IEPY https://github.com/ma…...

数据结构讲解二叉树 【一】

&#x1f381;&#x1f381;创作不易&#xff0c;关注作者不迷路&#x1f380;&#x1f380; C语言二叉树 【一】 前言一、数概念及结构1.数的概念1.2树的相关概念1.3树的表示 二、二叉树的概念及结构2.12.2二叉树的性质2.3二叉树的存储结构 三、二叉树的顺序结构实现3.1二叉树…...

MATLAB基础应用精讲-【数模应用】OR值

目录 前言 几个高频面试题目 or值越小代表什么 RR值、OR值及HR值的区别 算法原理 什么是OR值 OR值的计算方法和含义 注意事项 SPSSAU OR值和RR值 1、背景 2、理论 3、操作 4、SPSSAU 输出结果 5、文字分析 6、剖析 疑难解惑 SE(ln(OR)或SE(ln(RR)的意义? …...

[vulnhub] w1r3s.v1.0

https://www.vulnhub.com/entry/w1r3s-101,220/ 思路&#xff1a;红队笔记 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的&#xff0c;所以靶机IP是133 nmap -sP 192.168.75.0/24 // Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-20 09:09 CST…...

c#中的功能优势

装箱和拆箱 性能消耗的直接体现 int iterations 10000000; // 进行一千万次迭代Stopwatch stopwatch new Stopwatch();// 非装箱测试stopwatch.Start();for (int i 0; i < iterations; i){int x i; // 纯值类型操作&#xff0c;无装箱}stopwatch.Stop();Console.Writ…...

Windows系统设置定时任务,周期性执行.bat文件

通过.bat清除注册表项 在 Windows 系统中&#xff0c;.bat 文件&#xff08;批处理文件&#xff09;是一个包含一系列命令的文本文件。这些命令会被 Windows 命令解释器 (cmd.exe) 依次执行。 你可以把它想象成一个简单的程序&#xff0c;但它不像 C 或 Python 那样需要编译&a…...

xQTLs 共定位分析(XQTLbiolinks包)

XQTL 共定位分析 XQTLbiolinks 是一个端到端的生物信息学工具&#xff0c;由深圳湾实验室李磊研究团队开发&#xff0c;用于高效地分析公共或用户定制的个xQTLs数据。该软件提供了一个通过与 xQTLs 共定位分析进行疾病靶基因发现的流程&#xff0c;以检测易感基因和致病变异。…...

网络工程(学习记录)

day1创建Vlan Switch>enable Switch#configure terminal Switch(config)#hostname SW1 修改名称为SW1 SW1(config)# SW1(config)#vlan 10 创建vlan10 SW1(config-vlan)#vlan 20 SW1(config)#interface f0/1 进入接口f0…...

全志A133 android10 适配EC20 4G模块

一&#xff0c;移植适配 1. 驱动移植 代码路径&#xff1a;longan/kernel/linux-4.9/drivers/usb/serial/option.c diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 9f96dd2..2f25466 100644 --- a/drivers/usb/serial/option.cb/drivers/us…...

数据分析:Python语言网络图绘制

文章目录 介绍加载R包类别导入数据下载数据画图介绍 网络图是一种图形表示法,用于展示实体之间的关系。在不同的领域中,网络图有着不同的含义和用途:在生物学中,网络图可以用来表示生物分子之间的相互作用,如蛋白质相互作用网络。 加载R包 import pandas as pd import …...

使用ChatGPT引导批判性思维,提升论文的逻辑与说服力的全过程

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 批判性分析&#xff08;Critical Analysis&#xff09; 是论文写作中提升质量和说服力的重要工具。它不仅帮助作者深入理解和评价已有研究&#xff0c;还能指导作者在构建自己论点时更加…...

vue限定类型上传文件 最简单实践(单个可文件、可图片)

这个是为了文件导入弄的&#xff0c;内部运维人员使用的 目前还没做删除文件的交互 <el-uploadclass"upload-demo"ref"upload":before-upload"handleBeforeUpload"action"#"accept".xls,.xlsx":limit"1">&l…...

【GUI设计】基于图像分割和边缘算法的GUI系统(7),matlab实现

博主简介&#xff1a; 如需获取设计的完整源代码或者有matlab图像代码项目需求/合作&#xff0c;可联系主页个人简介提供的联系方式或者文末的二维码。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于图像分割和边缘算法的GUI系统…...

未来之窗VOS编程工具让你的工作效率翻倍———未来之窗行业应用跨平台架构

未来之窗编程工具概述 平板电脑/手机用于编程具有诸多优点。其便携性强&#xff0c;方便随时随地开展工作。触摸操作直观便捷&#xff0c;长续航能满足长时间需求&#xff0c;启动迅速。支持手写绘图&#xff0c;利于表达想法。能集成多种编程工具&#xff0c;还便于通过云服务…...

分布式数据库——HBase基本操作

启动HBase: 1.启动hadoop,进入hadoop的sbin中 cd /opt/hadoop/sbin/ 2.初始化namenode hdfs namenode -format 3.启动hdfs ./start-all.sh 4.启动hbase cd /opt/hbase/bin ./start-hbase.sh 5.使用jps查看进程 jps 以下图片则是hbase启动成功~ 运行HBase ./hbase sh…...

Go语言并发编程中的超时与取消机制解析

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 并发编程是Go语言的核心优势之一,而在实际应用中,超时和取消操作会频繁出现。超时机制能够帮助我们理解系统行为,防止系统因为某些任务执行过长而陷入困境。与此同时,取消操作则是应对超时的一种自然反应。此…...

Unity3D UIdocument如何改变层级详解

前言 在Unity3D中&#xff0c;UI文档的层级改变通常涉及UI元素的显示顺序&#xff0c;这是通过UGUI&#xff08;Unitys Graphical User Interface&#xff09;系统来实现的。以下是一篇关于如何在Unity3D中改变UI元素层级的详细解析&#xff0c;包括技术详解和代码实现。 对惹…...

Debian与Ubuntu:深入解读两大Linux发行版的历史与联系

Debian与Ubuntu&#xff1a;深入解读两大Linux发行版的历史与联系 引言 在开源操作系统的领域中&#xff0c;Debian和Ubuntu是两款备受瞩目的Linux发行版。它们不仅在技术上有着密切的联系&#xff0c;而且各自的发展历程和理念也对开源社区产生了深远的影响。本文将详细介绍…...

GPU服务器本地搭建Dify+xinference实现大模型应用

文章目录 前言一、显卡驱动配置1.检测显卡2.安装驱动 二、安装nvidia-docker二、安装Xinference1.拉取镜像2.运行Xinference3.模型部署 三、安装Dify1.下载源代码2.启动 Dify3.访问 Dify 四、Dify构建应用1.配置模型供应商2.聊天助手3.Agent 前言 本文使用的GPU服务器为UCloud…...

嵌入式程序设计经验 创建复位函数

在设计嵌入式系统重新时 需要考虑软复位的情况, 软复位时 很多变量都需要重置为初始值, 如果一个个去赋值 很麻烦, 下面是一个简单的办法 主要是对结构体 复位的方法: #include <stdint.h>typedef struct {uint8_t reg1;uint8_t reg2;uint8_t reg3; } StruSimuStat1…...

每天五分钟深度学习框架pytorch:交叉熵计算时的维度是什么?

本文重点 前面我们学习了pytorch中已经封装好的损失函数,已经封装好的损失函数有很多,但是我们并没有详细介绍,原因就是单独介绍损失函数可能难以理解,我们上一章节的目的是让大家先了解一下常见的损失函数,然后再之后的实际使用中遇到哪个损失函数,我们就使用哪个损失函…...

【Axure视频教程】跨页面控制中继器表格

今天教大家在Axure制作跨页面控制中继器表格的原型模板&#xff0c;我们可以在一个页面中通过交互&#xff0c;对另一个页面中的中继器进行控制&#xff0c;控制其显示的数据内容。那这个模板使用也很简单&#xff0c;复制粘贴按钮&#xff0c;在中继器表格里填写对应的数据&am…...

Android 利用OSMdroid开发GIS 添加 控件以及定位

部署看这个&#xff1a;Android 利用OSMdroid开发GIS-CSDN博客 添加控件&#xff0c;直接上源码 activity_main.xml&#xff1a; <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/…...

前端vue-实现富文本组件

1.使用wangeditor富文本编辑器 工具网站&#xff1a;https://www.wangeditor.com/v4/ 下载安装命令&#xff1a;npm i wangeditor --save 成品如下图&#xff1a; 组件实现代码 <template><div><!-- 富文本编辑器 --><div id"wangeditor">…...