链表的经典面试题(数据结构详解)+顺序表和链表之间区别+计算机存储体系

前言

首先这里已经正式步入数据结构的知识,之前我们已经讲解了链表的使用,接下来我们需要的就是大量的练习,熟练掌握数据结构。下面的题型我们选择的都是链表的经典题型,面试题型,包含快慢指针,数形结合,链表的证明题型,链表的熟练使用。并且会由简单到相对复杂来进行讲解计算。

面试题:返回倒数第k个节点(简单)

面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/kth-node-from-end-of-list-lcci/description/

这一题是很简单的当做试手题

题目

题目分析

1,这里的思路是利用快慢指针来进行解决

2,这里如果我们需要的是,倒数第2个节点的情况下,我们可以让快指针先移动两次

3,之后再同步进行移动,当快指针指向null的时候,说明慢指针此时指向需要的数值

4,这里需要注意的是,最后的返回值是数值->val,不是地址

代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
int kthToLast(struct ListNode* head, int k)
{ListNode* FAST=head;ListNode* SLOW=head;while(k--){FAST=FAST->next;}while(FAST){SLOW=SLOW->next;FAST=FAST->next;}return SLOW->val;}

链表回文

链表的回文结构_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=N7T8https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId=49&&tqId=29370&rp=1&ru=/activity/oj&qru=/ta/2016test/question-ranking

 题目

解决思路

1,先找中间节点

2,然会进行逆置

3,最后进行对比

 1,找到中间节点

这个我们采取快慢指针,来找到中间节点

快慢指针是一种常用的技巧,用于在链表或数组中找到中间节点、检测循环或者解决其他问题。快慢指针通常包括两个指针,一个快指针和一个慢指针。快指针每次移动两个节点,而慢指针每次移动一个节点。当快指针到达链表的末尾时,慢指针将指向链表的中间节点。
下面是快慢指针在链表中找到中间节点的步骤:
1. 初始化两个指针,快指针(fast)和慢指针(slow),都指向链表的头节点。
2. 在每次迭代中,将快指针向前移动两个节点,将慢指针向前移动一个节点。
3. 当快指针到达链表的末尾(即快指针为NULL或者快指针的下一个节点为NULL)时,慢指针将指向链表的中间节点。
如果链表的长度是奇数,慢指针将指向中间的节点;如果链表的长度是偶数,慢指针将指向中间两个节点的第一个节点。
下面是一个使用快慢指针在链表中找到中间节点的示例代码:

```c
ListNode* FindMid(ListNode* head) {if (head == NULL || head->next == NULL) {return head; // 链表为空或只有一个节点时,中间节点就是头节点}ListNode* slow = head;ListNode* fast = head;while (fast != NULL && fast->next != NULL) {slow = slow->next;       // 慢指针前进一步fast = fast->next->next; // 快指针前进两步}return slow; // 慢指针指向中间节点
}
```

在这个示例中,当快指针到达链表的末尾时,慢指针将指向链表的中间节点。如果链表有偶数个节点,慢指针将指向第二个中间节点。如果需要找到第一个中间节点,可以在循环结束后将慢指针再向前移动一个节点。

这里的判断条件看清楚,都是对快指针的判断,因为快慢指针涉及的是奇偶数

 while (fast != NULL && fast->next != NULL) 

2,然会进行逆置

逆置这里,不能直接进行逆置,直接进行逆置的情况下,容易导致循环节点,所以需要修改一下,也就是创建一个指针指向头结点

单链表逆置(这里还是有点难度的)

也称为链表翻转,是将链表中的元素顺序颠倒的过程。在单链表中,每个节点都有一个指向下一个节点的指针。逆置链表意味着改变每个节点的指向,使其指向前一个节点,而不是下一个节点。
链表逆置的常用方法是使用头插法。头插法是一种常用的链表操作技巧,用于在链表的头部插入新节点。在链表逆置过程中,我们可以从头开始遍历原始链表,并将每个节点作为新链表的头节点插入。
以下是单链表逆置的步骤:
1. 初始化两个指针,一个指向原始链表的头节点(current),另一个指向新链表的头部(newHead),初始时新链表为空。
2. 遍历原始链表:
   a. 使用临时指针(next)保存当前节点的下一个节点。
   b. 将当前节点的下一个节点指向新链表的头部(newHead),实现头插法。
   c. 更新新链表的头部为当前节点。
   d. 将当前节点移动到下一个节点(即临时指针指向的节点)。
3. 当原始链表遍历完毕后,新链表即为逆置后的链表。
下面是一个使用头插法逆置单链表的示例代码:


ListNode* Reverse(ListNode* head) {ListNode* newHead = NULL; // 新链表的头部ListNode* current = head; // 当前遍历的节点while (current != NULL) {ListNode* next = current->next; // 保存下一个节点current->next = newHead; // 将当前节点的下一个节点指向新链表的头部newHead = current; // 更新新链表的头部为当前节点current = next; // 移动当前节点到下一个节点}return newHead; // 返回新链表的头部
}

在这个示例中,`Reverse` 函数接受一个链表的头节点 `head` 作为参数,并返回逆置后的链表的头节点 `newHead`。通过头插法,原始链表中的每个节点都被逆序插入到新链表的头部,从而实现了链表的逆置。
 

图解

1,首先这里是一个环回链表,我们已经找到了中间节点

2,此时我们设置好变量

3,我们进行逆置的行动

我们不能直接进行逆置,这样的话会导致最后进行对比的时候,产生循环所以我们需要让中间数值的下一个节点指向null,然后再进行下面节点的转化

 3,最后进行对比

也就是,

代码

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
//进行重命名
#include <cstddef>
class PalindromeList {
public:
typedef struct ListNode ListNode;
//找到中间节点
ListNode* FindMid(ListNode* head)
{if(head == NULL || head->next == NULL){return head;}ListNode*slow =head;ListNode*fast =head;//这里的判断判断全部都是奇偶数while(fast && fast->next){slow=slow->next;fast=fast->next->next;}//返回中间节点return slow;
}//翻转链表
ListNode* Flip(ListNode* mid)
{ListNode* newhead = NULL;ListNode* cur = mid;while (cur) {ListNode* next= cur->next;//进行头插,不能直接进行链表的翻转,不然会产生回环链表cur->next = newhead;newhead = cur;cur = next;}return newhead;
}//进行对比,是回文结构就进行返回bool数值,不是的话返回null
bool chkPalindrome(ListNode* A)
{ListNode*mid= FindMid(A);ListNode*title=Flip(mid);while(A && title){if(A->val != title->val){return false;}A = A->next;title = title->next;}return true;
}};

相交链表

160. 相交链表 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/intersection-of-two-linked-lists/description/

题目

解决思路

1,找到相交的点

相交链表的关键也就是找到相交的点,所以我们需要首先判断有没有相交的节点,没有相交的节点结束返回NULL,有相交的节点继续,此时我们已经算出各自的链表的长度(一次循环)

2,算出长度差值

3,遍历找到节点

最后一步两个节点同时移动,当两个节点的地址等于的时候,此时也就是找到了相交的节点

代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{//这里的起始节点是1,因为链表场赌博是从1开始计算的int contA = 1;int contB = 1;//进行判断,是不是有相同的尾结点ListNode*cureA = headA;ListNode*cureB = headB;while(cureA){cureA = cureA->next;//计算A链表的长度contA++;}while(cureB){cureB = cureB->next;//计算B链表的长度contB++;}if(cureA != cureB){return NULL;}//假设法,假设A长//长的先走,直到指向的位置是平行的if(contA > contB){int contsame = contA-contB;while(contsame--){headA = headA->next;}}else{int contsame = contB-contA;while(contsame--){headB = headB->next;}}//找到交点while(headA){if(headA == headB){return headA;}headA = headA->next;headB = headB->next;}return NULL;
}

  随机链表的复制

138. 随机链表的复制 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/copy-list-with-random-pointer/description/

 题目

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

返回复制链表的头节点。

用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

  • val:一个表示 Node.val 的整数。
  • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

你的代码  接受原链表的头节点 head 作为传入参数。

 解题思路和图解

我们看见这个题目的时候首先就是看不懂,有点懵的。其实这都是我们想复杂了、这里你不能来回去追求random指向的节点的哪里,只需要直接进行拷贝就可以

步骤1(考察链表的创建,赋值):

  1. 首先我们需要复制链表节点
  2. 然后我们把赋值的节点里面是数值val放到复制的节点里面,这里是不需要赋值next的,因为你只需要直接进行插入就可以,形成新的长的链表。
  3. 一边复制一边把节点插入到原链表里面形成一个

步骤2(考察链表的逻辑关系):

  1. 此时我们复制val到链表里面并没有复制random也就是随机节点,所以这里我们需要复制随机节点
  2. 首先我们判断这个节点里面的random指向的节点是不是NULL,如果是NULL也就是说明指向空,也就是最后一个节点
  3. 如果不是NULL ,也就是说明,这个节点指向的下一个节点不是NUILL,此时我们需要注意,这里的关键点来了。我们需要让拷贝节点里面的random的地址是原链表的random指向的下一个节点,也就是random的->next,这样我们就达到我们不需要进行指向,直接就把地址拷贝过来。

步骤3(考察链表的插入):

  1. 最后一步,很简单,只需要把链表拷贝的节点和原链表分开
  2. 最后返回新链表的头结点

 代码

/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*///这里进行重命名一下,后期使用的时候不需要一直写struct
typedef struct Node Node;
Node* copyRandomList(Node* head) 
{//创建节点,复制节点,插入节点Node* cur = head;while(cur){//创建节点,并且进行检验Node* copy = (Node*)malloc(sizeof(Node));if(copy == NULL){perror("copyRandomList:copy:error");exit(1);}//复制数值copy->val = cur->val;//插入链表(这一步,两个不能交换)copy->next = cur->next;cur->next = copy;//遍历cur = copy->next;}//复制random节点cur = head;//cur一移动了重新指向头结点while(cur){Node* copy = cur->next;//找到copy拷贝节点,这里必须是循环里面的,因为每次都需要改变位置if(cur->random == NULL){copy->random = NULL;}else{copy->random = cur->random->next;}//遍历cur = copy->next;}//取出需要的节点,返回头结点cur = head;//cur一移动了重新指向头结点Node* copyhead = NULL;Node* copytile = NULL;//创建头结点和尾结点,不创建哨兵位了while(cur){//这一步已经完成循环移动了,我们只需要每次移动cur就可以完成整体的移动Node* copy = cur->next; Node* pure = copy->next;if(copytile == NULL){copyhead = copytile = copy;}else{//进行尾插copytile->next = copy;copytile = copytile->next;}cur = pure;}//返回新链表头结点return copyhead;
}

环形链表(是否成环)(简单)(证明题)

141. 环形链表 - 力扣(LeetCode)

题目

解题思路

1,我们把判断问题,用快慢指针搞成追击问题

代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*///如果链表中存在环 ,则返回 true 。 否则,返回 false 。
typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) 
{//快慢指针来解决ListNode* slow = head;ListNode* fast = head; while(fast && fast->next){slow = slow->next;fast = fast->next->next;if(fast == slow){return true;}}return false;
}

1,为什么一定会相遇,有没有可能错过,永远追不上?请证明(面试题)

一定会相遇

证明:已知这里是一次走两步

所以我们按照快指针一次两步进行推算

已知是快慢指针,所以我们已经从判断问题,变成了追击问题,

2,slow一次走一步,fast一次走3,4,5,6,n步行不行,为什么,请证明

证明:这里我们需要假设是快指针一次走三步

那此时说明3slow==fast

也就是三倍距离

所以我们进行证明

那么此时有两种可能性

第一种也就是当差距为偶数的时候

第二种也就是当差距为奇数的时候

因为进环之后开始追击,所以我们开始-数值

是否存在追不上的情况(证明)

什么情况下会追不上,也就是当第一次循环没有追上,第二次-1依旧是奇数没有追上,那么此时存在追不上的情况,但是这种情况是否存在?接下来我们进行证明。

环形链表(成环的相交的节点在哪)(中等)(证明题)

142. 环形链表 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/linked-list-cycle-ii/

题目

解题思路(证明一下)

这里的关键点在于你需要证明L==T

然后就可以解题

代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
ListNode *detectCycle(ListNode *head) 
{ListNode* fast = head;ListNode* slow = head;while(fast && fast->next){fast = fast->next->next;slow = slow->next;if(fast == slow){ListNode* cur = head;ListNode* meet = slow;while(cur != meet){cur = cur->next;meet = meet->next;}return meet;}}return NULL;
}

顺序表和链表之间区别

顺序表和链表是两种基本的数据结构,它们在存储方式和操作特性上有所不同:
1. **存储方式**:
   - **顺序表**:顺序表是连续的内存空间,元素按顺序依次存放。每个元素的地址可以通过首元素地址加上偏移量来直接计算。
   - **链表**:链表中的元素可以分散地存储在内存中,每个元素(节点)包含数据和指向下一个节点的指针。链表的存储是非连续的,节点间通过指针连接。
2. **元素访问**:
   - **顺序表**:可以直接通过索引快速访问任何一个元素,时间复杂度为O(1)。
   - **链表**:访问特定节点需要从头节点开始,按顺序遍历,时间复杂度为O(n)。
3. **插入和删除操作**:
   - **顺序表**:插入或删除元素时,可能需要移动大量元素以保持连续性,时间复杂度为O(n)。
   - **链表**:插入或删除元素只需改变指针,时间复杂度为O(1)(但查找插入位置或删除节点仍需O(n))。
4. **空间利用**:
   - **顺序表**:需要预先分配固定大小的内存空间,可能会造成空间浪费。
   - **链表**:动态分配内存,更灵活地利用空间。
5. **内存分配**:
   - **顺序表**:通常在栈上或通过malloc一次性分配。
   - **链表**:节点在堆上动态分配,通过指针链接。
6. **适用场景**:
   - **顺序表**:适用于频繁随机访问元素的场合。
   - **链表**:适用于频繁插入和删除元素的场合。
两者各有优势,选择哪种数据结构取决于具体应用场景和需求。在实际应用中,还会根据需要衍生出多种链表的变体,如双向链表、循环链表等,以适应不同的应用场景。

 

原地扩容和异地扩容

原地扩容(In-place expansion)和异地扩容(Out-of-place expansion)通常是指在数据结构或存储系统中对容量进行扩展的两种方式。
1. **原地扩容(In-place expansion)**:
   - 这种方式通常指的是在原有的空间内进行扩容,不需要移动数据到新的位置。
   - 例子包括:在数组或内存池中,当需要更多空间时,可以在原有内存地址后追加更多的空间。这种方式可能涉及到复杂的内存管理,因为可能需要重新分配更大的连续内存块,并移动原有数据到新位置。
2. **异地扩容(Out-of-place expansion)**:
   - 异地扩容则是将数据移动到一个新的、更大的空间中,通常是创建一个新的数据结构或存储空间,然后将旧数据复制或迁移到新空间。
   - 例子包括:在链表结构中,可以通过创建新的节点并在新节点中存储更多的数据来实现扩容。在文件系统中,可能需要将文件从一个分区移动到另一个更大的分区。
在具体的技术应用中,原地扩容和异地扩容有其各自的优缺点:
- 原地扩容可能更高效,因为它不需要复制大量数据到新的位置,但可能涉及到复杂的内存管理和潜在的内存碎片问题。
- 异地扩容可能更简单实现,因为它通常涉及到创建新的资源,但数据迁移过程可能会耗费较多时间和资源。
选择哪种扩容方式取决于具体的应用场景、资源限制以及对性能的要求。在设计数据结构和系统时,通常会根据实际需求来决定最合适的扩容策略。

原地扩容和异地扩容

原地扩容

异地扩容

这里不要释放 不管是原地还是异地

如果是原地扩容说明是原来的地址

如果是异地扩容,则不需要手动释放,会主动释放

计算机的存储体系

存在内存里面的时候 不通电是不行的 这里是临时存储的

内存的存储速度比硬盘快

这里是越往下越便宜

eax寄存器

cpu是不会直接访问内存的

因为觉得太慢了

所以一般加载到缓存再访问

然后进行访问

与程序员相关的CPU缓存知识 | 酷 壳 - CoolShellicon-default.png?t=N7T8https://coolshell.cn/articles/20793.html#google_vignette

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/325155.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【qt】设计器实现界面

设计器实现界面 一.总体思路二.具体操作1.创建项目2.粗略拖放3.水平布局4.垂直布局5.修改名字6.转到槽7.实现槽函数 一.总体思路 创建项目粗略拖放水平布局垂直布局修改名称转到槽实现槽函数 二.具体操作 1.创建项目 这次咱们一定要勾选Generate form哦。 因为我们要使用设…

R语言数据探索与分析-碳排放分析预测

# 安装和加载需要的包 install.packages("readxl") install.packages("forecast") install.packages("ggplot2") library(readxl) library(forecast) library(ggplot2)# 数据加载和预处理 data <- read_excel("全年数据.xlsx") co…

感知机和神经网络

引入 什么是神经网络&#xff1f; 我们今天学习的神经网络&#xff0c;不是人或动物的神经网络&#xff0c;但是又是模仿人和动物的神经网络而定制的神经系统&#xff0c;特别是大脑和神经中枢&#xff0c;定制的系统是一种数学模型或计算机模型&#xff0c;神经网络由大量的人…

FANUC机器人工具坐标偏移的用法

一、工具坐标偏移的使用场景 在机器人位置不改变的情况下&#xff0c;工业机器人使用默认工具坐标系示教的一系列运动点位&#xff0c;要保持原本点位位置不变的情况下&#xff0c;改变机器人工具坐标的参数&#xff0c;就要用到机器人坐标转化的功能。在FANUC机器人上体现为机…

通过mvn archetype 创建一个spring boot start 工程

mvn archetype https://maven.apache.org/archetype/index.html 遇到的问题 对于想自定义一个spring-boot-start的同学,比如 Springboot自定义Starter启动器 整个过程很繁琐。 定义属性开关增加 spring boot test start插件定义自动装载 spring.factories or org.springfra…

关于一致性,你该知道的事儿(上)

关于一致性&#xff0c;你该知道的事儿&#xff08;上&#xff09; 前言一、缓存一致性二、内存模型一致性三、事务一致性四、分布式事务一致性4.1 分布式系统的一些挑战4.2 关于副本的一些概念4.3 分布式事务之共识问题4. 3.1 PC(two-phase commit, 2PC)4.3.2 Raft 三、后记参…

【牛客】SQL201 查找薪水记录超过15条的员工号emp_no以及其对应的记录次数t

1、描述 有一个薪水表&#xff0c;salaries简况如下&#xff1a; 请你查找薪水记录超过15条的员工号emp_no以及其对应的记录次数t&#xff0c;以上例子输出如下&#xff1a; 2、题目建表 drop table if exists salaries ; CREATE TABLE salaries ( emp_no int(11) NOT N…

python数据分析——pandas数据结构2

参考资料&#xff1a;活用pandas库 导入基础数据 # 导入库 import pandas as pd # 读取数据集 dfpd.read_csv(r"..\data\scientists.csv") df.head() 1、DataFrame DataFrame是Pandas中最常见的对象。可以把它看作python存储电子表格式数据的方式。Series数据结构…

基于单片机的温度控制系统设计(51基础版)-设计说明书

本论文设计了一种基于51单片机的温度控制系统&#xff0c;该系统具备以下主要功能&#xff1a;首先&#xff0c;通过温度传感器实时检测环境温湿度&#xff0c;以获取准确的温度数值。其次&#xff0c;通过按键设置温度阈值&#xff0c;用户可以根据需求自行调整控制温度的上限…

Dragonfly 拓扑的路由算法

Dragonfly 拓扑的路由算法 1. Dragonfly 上的路由 (1)最小路由(2)非最小路由 2. 评估3. 存在问题 (1)吞吐量限制(2)较高的中间延迟 references Dragonfly 拓扑的路由算法 John Kim, William J. Dally 等人在 2008 年的 ISCA 中提出技术驱动、高度可扩展的 Dragonfly 拓扑。而…

杰发科技AC7801——ADC之Bandgap和内部温度计算

0. 参考 电流模架构Bandgap设计与仿真 bandgap的理解&#xff08;内部带隙电压基准&#xff09; ​ ​ 虽然看不懂这些公式&#xff0c;但是比较重要的一句应该是这个&#xff1a;因为传统带隙基准的输出值为1.2V ​ 1. 使用 参考示例代码。 40002000是falsh控制器寄…

从离线到实时:无锡锡商银行基于 Apache Doris 的数据仓库演进实践

作者&#xff1a;武基鹏&#xff0c;无锡锡商银行 大数据技术经理 编辑整理&#xff1a;SelectDB 技术团队 导读&#xff1a;为实现数据资产的价值转化以及全面数字化、智能化的风险管理&#xff0c;无锡锡商银行大数据平台经历从 Hive 离线数据仓库到 Apache Doris 实时数据仓…

鸿蒙ArkUI-X跨平台开发电商应用

一、ArkUI-X 简介 ArkUI-X 是由 OpenHarmony TSC - 跨平台应用开发框架 TSG 所孵化的开源项目,使用ArkUI-X可以让开发者基于一套主代码, 就可以构建支持多平台的精美、高性能应用。目前支持OpenHarmony、HarmonyOS、Android、 iOS,后续会逐步增加更多平台支持。 ArKUI跨平台…

经典权限五张表功能实现

文章目录 用户模块(未使用框架)查询功能实现步骤代码 新增功能实现步骤代码 修改功能实现步骤代码实现 删除功能实现步骤代码实现 用户模块会了&#xff0c;其他两个模块与其类似 用户模块(未使用框架) 查询功能 这里将模糊查询和分页查询写在一起 实现步骤 前端&#xff1…

哈希表(unordered_set、unordered_map)

文章目录 一、unordered_set、unordered_map的介绍二、哈希表的建立方法2.1闭散列2.2开散列&#xff08;哈希桶/拉链法&#xff09; 三、闭散列代码&#xff08;除留余数法&#xff09;四、开散列代码&#xff08;拉链法/哈希桶&#xff09; 一、unordered_set、unordered_map的…

[单机]成吉思汗3_GM工具_VM虚拟机

稀有端游成吉思汗1,2,3单机版虚拟机一键端完整版 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#x…

【基于 PyTorch 的 Python 深度学习】6 视觉处理基础:卷积神经网络(1)

前言 文章性质&#xff1a;学习笔记 &#x1f4d6; 学习资料&#xff1a;吴茂贵《 Python 深度学习基于 PyTorch ( 第 2 版 ) 》【ISBN】978-7-111-71880-2 主要内容&#xff1a;根据学习资料撰写的学习笔记&#xff0c;该篇主要介绍了卷积神经网络的卷积层部分。 预&#xff1…

unity ui 同屏

一共有三个摄像机&#xff0c;上屏&#xff0c;下屏 和 类似照相机的ccamera 类似照相机的ccamera的设置&#xff1a; 下屏摄像机设置&#xff1a; 下屏交互的Canvas设置&#xff1a; 新建一个canvas&#xff0c;下面放上rawimage&#xff1a; 如果下屏不想显示的内容&#xf…

2024蓝桥杯RSA-Theorem

方法1&#xff1a;直接使用工具yafu解题 yafu的使用方法 安装&#xff1a;解压后直接使用即可&#xff0c;在文件包内&#xff0c;执行命令终端&#xff0c;输入命令行 1、如果数比较小&#xff0c;进入该文件的目录后可以直接使用: yafu-x64 factor(n) 如果是powershell&…

Maven 的仓库、周期和插件

优质博文&#xff1a;IT-BLOG-CN 一、Maven 仓库 在Maven的世界中&#xff0c;任何一个依赖、插件或者项目构建的输出&#xff0c;都可以称为构建。Maven在某个统一的位置存储所有项目的共享的构建&#xff0c;这个统一的位置&#xff0c;我们就称之为仓库。任何的构建都有唯一…