自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(92)
  • 收藏
  • 关注

原创 手写线程池|C语言版(二)|定义线程池的结构、创建线程池实例

下列结构体定义在文件threadpool.c中//任务队列//任务队列//容量//当前任务个数//队头->取数据//队尾->放数据// 管理者线程//管理者线程ID//工作的线程ID//最小线程数//最大线程数//忙的线程数//存活的线程// 要杀死的线程个数//锁//锁整个的线程池//锁busyNums,因为其变化比较频繁//条件变量//任务队列是不是满了//任务队列是不是空了//是不是要销毁线程池,销毁为1,不销毁为0。

2024-04-28 02:22:21 102

原创 MIT6.824|课程前置知识

为了让技术栈更宽一点,想学习一下分布式系统,顺便下定决心学习一下go语言吧!由于还没有开始学,这里只总结相关的资料,后续会慢慢进化成MIT6.824课程导学。

2024-04-27 21:38:59 162

原创 代码随想录算法训练营DAY39|C++动态规划Part.2|62.不同路径、63.不同路径II

如果我们不把最上面一行和最左面一列的位置进行初始化 ,其他格子的路径和是无法推导的。给定的题目是二维的一个地图,所以我们的dp数组肯定也得是一个二维的。本题其实可以用深度优先搜索,但是那会超时。但是一定要注意障碍物在初始化边上的情况。同上[62.不同路径](# dp含义)同上[62.不同路径](# 递推公式)与上题的区别:在整个路径中多了障碍。不需要推导,因为我们走不了这一步。与上一题中有相同也有不同,因为从。老规矩,还是从左到右一层层遍历。从左往右遍历,从上往下遍历。但是由于障碍的存在,比如第。

2024-04-27 13:31:54 658

原创 C语言|关于C语言变量的作用域、链接、存储期及相关知识(C多文件编程基础)

这些变量。

2024-04-26 13:10:02 809

原创 代码随想录算法训练营DAY38|C++动态规划Part.1|动态规划理论基础、509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯

动态规划(Dynamic Programming, DP),如果某一个问题有很多重叠子问题,这样往往是用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。动规是由前一个状态推导出来的,而贪心是从局部直接选出最优的。dp[i]表示第i个斐波那契数值为dp[i]

2024-04-26 08:55:15 775

原创 代码随想录算法训练营DAY37|C++贪心算法Part.6|738.单调递增的数字、968.监控二叉树、贪心算法总结

贪心算法总结卡哥的贪心总结真的已经很帅了,但是一刷的我并不太能get到,等到二刷个人再总结一波!/Users/cherry/MyLab/GOJOB/C++/代码随想录/算法训练营/assets/20201229203710729.png/Users/cherry/MyLab/GOJOB/C++/代码随想录/算法训练营/assets/20201229203742446.png。

2024-04-25 11:26:24 469

原创 代码随想录算法训练营DAY36|C++贪心算法Part.5|435.无重叠区间、763.划分字母区间、56. 合并区间

就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,如果这个最小值也触达到区间3,那么说明 区间 1,2,3都是重合的。在代码处理上是直接不管,因为我们只关注非交叉区间的个数,到时候直接总区间个数-非交叉区间的个数就能求得要删除区间的个数。要首先计算出之前我们判断的相邻区间的最小边界(左边界的最小值),和我们下一个区间的左边界是否重叠。总共区间个数为6,减去非交叉区间的个数3。区间4结束之后,再找到区间6,所以一共记录非交叉区间的个数是三个。

2024-04-24 10:59:45 592

原创 linux编程基础|网络编程之epoll边沿模式的非阻塞方法

本文供自己复习使用,更加详细的信息可以参见:大丙哥文章:IO多路转接(复用)之epoll大丙哥视频:Linux编程 - 网络篇【IO多路转接 - 提升】边沿模式可以简称为ET模式,ET(edge-triggered)是高速工作方式,只支持no-block socket。在这种模式下,当文件描述符从未就绪变为就绪时,内核会通过epoll通知使用者。然后它会假设使用者知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知(only once)。如果我们对这个文件描述符做IO操作,从而导致它再次

2024-04-23 20:56:30 525

原创 C++从零开始websevere服务器从搭建到上线|使用华为云服务器进行项目部署

总而言之,无法访问最主要的原因就是防火墙的端口未开放,然后就是设置华为云服务器的安全组,这些整完,只要你服务器源代码没问题,肯定是能成功的。综上,我们再通过浏览器访问IP:port就可以看到我们服务端的界面啦。

2024-04-23 16:54:45 888

原创 代码随想录算法训练营DAY35|C++贪心算法Part.4|860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

贪心+模拟解体。局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。首先我们手里一分钱都没有:遇到5美元顾客遇到10美元顾客遇到20美元:因为5美元即可以找10美元也可以找20美元,所以我们遇到20美元先用10美元来找零CPP代码406.根据身高重建队列思路本题的思路是怎么来的呢?首先这里举个例子,h和k分别表示身高和队列前面身高大于等于该的人数如果我们考虑k,并且如果k相同就把身高h小的放到队伍后面(因为k相同大身高如果放前面,k值肯定会

2024-04-23 11:56:11 777

原创 代码随想录算法训练营DAY34|C++贪心算法Part.3|1005.K次取反后最大化的数组和、134.加油站、135.分发糖果

局部最优——只找数值最小的正整数进行反转,当前数值和可以达到最大(例如正整数数组{5, 3, 1},反转1得到-1比反转5得到-5要好太多。从下标2的位置可以看出,我们只能通过2后面的下标开始收集油,这样才能有希望突破2这个位置。为负数,那么我们从非零结点出发,从后向前开车,看哪个结点能把这个负数填平,说明我们从这个结点出发就能跑完一圈。抽象出来,本题的局部最优并不是某个孩子的左右孩子比较,而是先一直从左往右比较,然后。很直观的一个暴力解法情况,我们遍历每一个加油站为起点的情况,模拟一圈。

2024-04-23 11:50:26 702

原创 代码随想录算法训练营DAY32|C++贪心算法Part.2|122.买卖股票的最佳时机II、55.跳跃游戏、45.跳跃游戏II

从上文可以看出,我们要比较当前范围下能扩充的最终范围。

2024-04-23 11:46:33 955

原创 代码随想录算法训练营DAY31|C++贪心算法Part.1|贪心算法的理论基础、455.分发饼干、376.摆动序列、53.最大子序和

本题异常情况的本质,就是要考虑平坡, 平坡分两种,一个是 上下中间有平坡,一个是单调有平坡。

2024-04-22 20:51:38 800

原创 代码随想录算法训练营DAY30|C++回溯算法Part.6|332.重新安排行程、51.N皇后、31.解数独

递归终止条件:输入: [[“MUC”, “LHR”], [“JFK”, “MUC”], [“SFO”, “SJC”], [“LHR”, “SFO”]] ,这是有4个航班,那么只要找出一种行程,行程里的机场个数是5就可以了。本题中的终止条件全部放到单层递归的逻辑里面,因为递归的下一层的棋盘一定比上一层的棋盘多一个数,等数填满了棋盘自然就终止(填满当然好了,说明找到结果了),所以不需要终止条件!因为解数独找到一个符合的条件(就在树的叶子节点上)立刻就返回,相当于找从根节点到叶子节点一条唯一路径,所以需要使用。

2024-04-22 20:44:22 577

原创 代码随想录算法训练营DAY29(记录)|C++回溯算法Part.5|491.递增子序列、46.全排列、47.全排列II

也就是本题的递增子序列有要求子集,然后还要去重,但是:本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。从树形结构可以看出,我们每次都是从头开始,即使元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次1。递归函数参数:求子序列,很明显一个元素不能重复使用,所以需要startIndex,调整下一层递归的起始位置。这里我们会使用used数组,记录此时path里都有哪些元素使用啦,一个排列里一个元素只能使用一次。那么我们这里要判断了,是树层去重呢,还是树枝去重?

2024-04-17 22:17:55 864

原创 代码随想录算法训练营DAY28|C++回溯算法Part.4|93.复原IP地址、78.子集、90.子集II

递归终止条件:本题题目明确要求只分四段,也就如上文所说,3个pointNum就说明字符串分成四段了,我们检查一下第四段是否合法,就可以放入到结果集中了。状态:一种十分典型的分割问题,根据IP地址的特征从分割一个字符、两个字符、三个字符推进,但是其中肯定是要进行剪枝的。但是究其本质,子集问题仍然是一个组合问题,因为它的集合是无序的,子集{1, 2}{2, 1}是一样的。递归终止条件:从树形结构可以看出,剩余集合为空的时候,我们的递归就结束了。这种分割问题,我们一定要用暴力枚举每一种分割的情况。

2024-04-16 11:05:37 933

原创 手写线程池|C语言版(一)|线程池的定义和运行逻辑

任务队列,存储需要处理的任务,由工作的线程来处理这些任务。那么一个很自然的想法就出现了,如果能有一种技术。管理者线程(不处理任务队列中的任务),1个。就此,线程池技术应运而生。

2024-04-15 21:59:07 421

原创 Linux基础|多线程|信号量——生产者消费者模型

要添加两个,一个给生产者用,一个给消费者用。//生产者的信号量//消费者的信号量//生产者//0表示线程同步,第三个参数是初始化的资源数//消费者->资源初始化为0,因为生产者还没生产呢,我们需要消费者启动就阻塞本题中互斥锁、读写锁都可以。本文加互斥锁//生产者的信号量//消费者的信号量//生产者//0表示线程同步,第三个参数是初始化的资源数//消费者->资源初始化为0,因为生产者还没生产呢,我们需要消费者启动就阻塞//销毁信号量资源return 0。

2024-04-15 18:29:55 219

原创 Linux基础|多线程|条件变量——生产者和消费者模型

场景描述:使用条件变量实现生产者和消费者模型,生产者5个,往链表头部添加结点,消费者也有5个,删除链表头部的结点。该代码块,我们是创建一个新结点,然后再打印他的值,这里有一连串的变量操作。链接: https://subingwen.cn/linux/thread-sync/当条件变量抢到互斥锁之后,他会自动开锁,所以所有被这把互斥锁阻塞的进程都能自由进出。那么现在又有一个问题了,如果所有的消费者都阻塞到这里了,什么时候才能解除阻塞呢?第一个变量是各自地址,第二个变量是各自的属性,一般为NULL。

2024-04-15 17:21:11 301 2

原创 Linux基础|虚拟地址空间和文件描述符

本博客参考博客仅作个人学习使用。

2024-04-15 16:09:44 633

原创 代码随想录算法训练营DAY27|C++回溯算法Part.3|39.组合总和、40.组合总和II、组合问题小总结、131.分割回文串

什么时候要用startIndex来控制for循环,什么时候不用呢?如果是一个集合来求组合的话,就需要用startIndex,例如:77.组合,216.组合总和III如果是多个集合取组合,各个集合之间相互不影响,那么就用startIndex,例如:17.电话号码的字母组合。

2024-04-15 14:21:27 658 3

原创 代码随想录算法训练营DAY23|C++二叉树Part.9|669.修建二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

在这里,我们定义好了左闭右闭区间,为了遵守循环不变量原则,在不断分割的过程中也一定要坚持左闭右闭的原则。划分区间的时候,root的左孩子接住下一层左区间的构造结点,右孩子接住下一层右区间构造的结点。这里定义的是左闭右闭的区间,所以当区间left>right当时候,就是空结点了。也就是说数组上的每个位置,都把其前面位置做一个相加,瞬间就能变成一个送分题。右中左遍历二叉树,中结点的处理逻辑就是让cur的数值加上前一个结点的数值。本题同理,依然用递归函数u的返回值来构造中结点的左右孩子。

2024-04-14 19:52:01 1065 1

原创 代码随想录算法训练营DAY22|C++二叉树Part.8|235.二叉搜索树的最近公共祖先、450.删除二叉搜索树中的结点

状态:由于删除二叉搜索树可能涉及到二叉搜索树结构的改变,所以一定要注意分情况讨论,详细的代码实现也一定要记住。这里就讲究了,涉及到插入结点的操作,因为我们可以让待删结点的右孩子来代替删除位置,那么待删结点的左孩子就。如果发现根结点比q和p的数值都小的话,说明目标结点一定在我们根结点的右子树。其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点。其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点。普通二叉树的删除方式就必须遍历整颗树,用交换值的操作来删除目标结点。

2024-04-14 16:59:38 658

原创 代码随想录算法训练营DAY21|C++二叉树Part.7|530.二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236.二叉树的最近公共祖先

现在我们再问该问题:判断二叉搜索树的最小绝对差是多少?最直观的想法就是:用中序遍历搞成一个有序数组,然后求数组的最小绝对差利用二叉搜索树的特性,最小绝对差必然出现在中序遍历后的相邻结点之间。因为中序遍历是按照递增顺序来阻止的,最小绝对差肯定是相邻的。我们用双指针,在中序遍历的时候直接比较绝对差,这样就不用额外构造数组了。比如说,我们用一个cur和一个pre指针,pre指针则一直跟在cur的屁股后面跑。这个是如何实现的呢?同时遍历顺序务必要满足中序遍历(让遍历过程是有序的),这样的比较才是有意义的。双指针

2024-04-14 11:51:13 1002

原创 【解决leecode打不开的问题】使用chrome浏览器和其他浏览器均打不开leecode

问题描述:能进入leetcode力扣官网但是对某些栏目加载不出来,比如学习栏目能完成加载、题库栏目不能加载。

2024-04-13 11:45:20 393

原创 代码随想录算法训练营DAY25|C++回溯算法Part.2|216. 组合总和II、17.电话号码的字母组合

状态:根据题目可知,k是决定树形结构的深度,那么要求组合为n的这个限制条件,我们如何写代码呢?树的深度是由我们输入的数字个数来定,树的宽度就是数字所对应的字母的长度来控制的。题目其实就是给定一个[1, 9]的集合,求组合,要求组合和为n,个数为k。其实也是回溯的一种体现,因为从目前的i开始,一直往后所有的i都不需要了。本题中使用二维数组来做映射,这里也回答了状态1中提出的问题。数字到字母的映射可以用map,也可以用二维数组来做映射。本质上就是在组合问题的基础上加了一个和的限制。,树的深度由k来决定。

2024-04-13 10:47:03 875

原创 代码随想录算法训练营DAY20|C++二叉树Part.6|654.最大二叉树、617. 合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

public:// 重新定义新的节点,不修改原有两个树的结构。

2024-04-12 16:54:33 386

原创 代码随想录算法训练营DAY24|C++回溯算法Part.1|回溯算法理论基础、77.组合、组合问题的剪枝操作

举个例子,n = 4,k = 3, 目前已经选取的元素为0(path.size为0),n - (k - 0) + 1 即 4 - ( 3 - 0) + 1 = 2。回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数。在上面我们提到了,回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度。既然回溯问题可以抽象成树形结构,那么遍历树形结构一定要有终止条件,所以回溯也要有终止条件。给他画一个回溯算法的搜索过程。

2024-04-12 14:37:30 1070

原创 代码随想录算法训练营DAY18|C++二叉树Part.5|513.找树左下角的值、112. 路径总和、113.路径总和II、106\105.从中(前)序与后(中)序遍历序列构造二叉树

所以左下角的值完全可能在右子树。

2024-04-06 11:55:48 772

原创 代码随想录算法训练营DAY17|C++二叉树Part.4|110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

状态:还是有思路,我们的cur遍历到叶子结点的前一个结点,也就是cur结点的左结点的(左结点和右结点)为空,这样我们就能顺利找到左叶子。这里的递归函数,通过返回二叉树的高度是最好的,即使我们不需要求二叉树的高度。当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。确定递归的返回值和参数:判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的。还有一个要注意的点就是关于递归终止条件,本题的终止条件和之前的有什么不一样呢?

2024-04-05 19:05:16 903

原创 小林coding图解计算机网络|TCP篇06|如何理解TCP面向字节流协议、为什么UDP是面向报文的协议、如何解决TCP的粘包问题?

我们可以自定义一个消息结构,由包头和数据组成,其中包头包是固定大小的,而且包头里有一个字段来说明紧随其后的数据有多大。比如这个消息结构体,首先 4 个字节大小的变量来表示数据长度,真正的数据则在后面。当接收方接收到包头的大小(比如 4 个字节)后,就解析包头的内容,于是就可以知道数据的长度,然后接下来就继续读取数据,直到读满数据的长度,就可以组装成一个完整到用户消息来处理了。

2024-04-05 12:20:15 1480 1

原创 小林coding图解计算机网络|基础篇03|Linux 系统是如何收发网络包的?

副本 sk_buff 会被送往网络层,等它发送完的时候就会释放掉,然后原始的 sk_buff 还保留在传输层,目的是为了实现 TCP 的可靠传输,等收到这个数据包的 ACK 时,才会释放原始的 sk_buff。,在这一层会检查报文的合法性,如果不合法则丢弃,合法则会找出该网络包的上层协议的类型,比如是 IPv4,还是 IPv6,接着再去掉帧头和帧尾,然后交给网络层。至此,一个网络包的接收过程就已经结束了,你也可以从下图左边部分看到网络包接收的流程,右边部分刚好反过来,它是网络包发送的流程。

2024-04-05 11:44:06 967

原创 操作系统八股|用户态和内核态

为了使操作系统内核提供⼀个⽆懈可击的进程抽象,处理器必须提供⼀种机制,。处理器通常是⽤某个控制寄存器中的⼀个来提供这种功能的,该寄存器描述了进程当前享有的特权。当设置了时:进程就运⾏在内核态中。运⾏在内核态中的进程可以,并且可以。没有设置时: 进程就运⾏在⽤户态。⽤户模式中的进程不允许执⾏特权指令。

2024-04-05 10:45:22 437

原创 小林coding图解计算机网络|基础篇02|键入网址到网页显示,期间发生了什么?

浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去 hosts 文件看,也没有,才会去问「本地 DNS 服务器」。于是,扒开 TCP 的头,里面有序列号,需要看一看这个序列包是不是我想要的,如果是就放入缓存中然后返回一个 ACK,如果不是就丢弃。不知你发现了没有,在网络包传输的过程中,源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。

2024-04-04 21:00:39 1155

原创 小林coding图解计算机网络|基础篇01|TCP/IP网络模型有哪几层?

网络接口层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。但这些名词并没有什么本质的区分,可以统称为数据包。

2024-04-04 17:08:41 1273 1

原创 代码随想录算法训练营DAY16|C++二叉树Part.3|104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

确定终止条件:如果为空结点的话,就返回0,表示高度为0确定单层递归逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的值,再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。CPP代码⭐️精简后的代码如下:精简之后的代码根本看不出是哪种遍历方式,也看不出递归三部曲的步骤,所以如果对二叉树的操作还不熟练,尽量不要直接照着精简代码来学。本题和上一题思想很类似,但是有一个细节需要我们讨论。使用递归遍历的话,再确定单层递归逻辑很容易写成:这个代码就出现了错误!如

2024-04-04 10:41:13 1001

原创 代码随想录算法训练营DAY15|C++二叉树Part.2|102.二叉树的层序遍历、226.翻转二叉树、101. 对称二叉树

状态:对于二叉树的题,往往会涉及到遍历顺序,此题要求反转二叉树,也就每个结点的左右孩子进行反转,最直观的应该当属前序遍历或者后序遍历。返回值本来是不需要的,但是题目中要求给出返回root结点的指针,我们就直接使用题目定义好的函数。由于其并不是把当前层遍历完再去遍历下一层的规则,所以层序遍历的递归法总体还是比较难懂的。这样遍历主要是因为,左子树的左侧对应右子树的右侧,左子树的右侧对应右子树的左侧。左右都不空,但是结点数值不相等;二叉树类的题目,确定遍历深度是非常重要的,决定了我们对题目理解的深度。

2024-04-03 15:13:36 1286

原创 代码随想录笔记|C++数据结构与算法学习笔记-二叉树(七)|LeetCode617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

用来比较遍历的节点是否有序,因为后台测试数据中有int最小值,所以定义为longlong的类型,初始化为longlong最小值。

2024-04-02 19:56:59 283

原创 代码随想录笔记|C++数据结构与算法学习笔记-二叉树(六)|LeetCode106.从中序与后序遍历序列构造二叉树、654.最大二叉树

那么再切换到中序可知,左区间是9,右区间是15,20,7;再切换回后序9,15,7,20中,9是左子树里面的,15,7,20是右子树的元素;6是最大的数,3 2 1是左子树,3又是最大的数作为6的左孩子;2 1是3的右区间作为右子树,2又是最大的作为3的右孩子,1是2的右区间,所以1是2的右孩子,由此得出二叉树。选择数组中最大的书,来切割数组,左区间作为左子树,右区间作为右子树,如此循环构造一颗最大二叉树。切割后序数组,拿切中序数组形成的左中序数组去切,因为他俩都是一样的:形成左后序 右后序。

2024-04-02 17:22:53 959

原创 代码随想录算法训练营DAY14|C++二叉树Part.1|二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代法

状态:迭代中的第一步没处理好,一直在想我怎么在迭代中让结点遍历起来呢?后序遍历最难的点就在于,我们遍历的结点不是我们要处理的结点,我们遍历过该结点后可能要到后面才能去处理,这样应该怎么办呢?前序遍历是中左右-----(调整代码左右循环)---->中右左----(反转result数组)---->左右中。如果用递归的思路来思考前序遍历,其实就是每到一个结点,我们就对其先进性处理,然后分别去遍历左、右孩子。迭代遍历总结两点:栈内存储的是结点,这样才知道如何结点是如何遍历起来的;再进一步,中序遍历的规矩就是,

2024-04-02 17:00:50 702

李宏毅老师语音识别课程

想起课程B站上有: 课程主页如下 [李宏毅DLHLP2020课程资料首页](http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html )

2023-09-12

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除