自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 进程间通信的方式

消息的发送方和接收方事件约定好消息体的数据类型,每个消息体都是固定大小的存储块,不像管道是无格式的字节流数据。type 参数⽤来指定通信特性,⽐如 SOCK_STREAM 表示的是字节流,对应 TCP、SOCK_DGRAM 表示的是数据报,对应 UDP、SOCK_RAW 表示的是原始套接字;因为管道没有实体,也就没有管道文件,只能通过fork命令复制父进程的文件描述符fd,来达到通信的目的。消息队列也有其局限性,一是通信不够及时,二是消息队列的大小也有限制,即每个消息体有一个最大长度的限制。

2024-02-27 21:45:00 918

原创 SocketWeb实现小小聊天室

WebSocket是一种基于TCP连接上进行全双工通信的协议。(附HTTP协议工作模式:http1.0:单工。因为是短连接,客户端发起请求之后,服务端处理完请求并收到客户端的响应后即断开连接http1.1:半双工。默认开启长连接keep-alive,开启一个连接可发送多个请求http2.0:全双工,允许服务端主动向客户端发送数据)

2024-02-25 20:41:37 1500

原创 Java学习小记——设计模式

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。

2024-02-20 22:26:38 1453

原创 Java学习小记——多线程&Socket编程

在创建一个线程时存在一定的开销,创建线程的开销相比于一般的算法来说较大。首先需要建立一个调用栈,接着操作系统还需要建立很多数据结构来维护线程的状态等等。为了解决每次都需要临时创建线程带来开销的问题,引入了线程池。线程池会预先建立好线程,等待任务派发。一个线程池内可能会有几十上百个闲置的线程,当有任务来临时,需要选中一个线程执行任务。执行完毕后释放该线程资源,重新回到闲置状态,等待下一个任务。在线程池中,通常有一个Blocking Queue用来派发任务。

2024-02-19 21:49:10 2136

原创 数据库系统学习小记

关系型数据库是建立在关系模型基础上的数据库,依靠表、字段等关系模型,结合集合代数等数学方法来处理数据。关系型数据的理论基础就是关系代数。关系型数据库提出了第一范式到第五范式,一般做到第三范式或者BCNF范式。第一范式:符合1NF的关系中的每个属性都不可再分,是所有关系型数据库最基本的要求;第二范式:在1NF的基础之上,消除非主属性对于码的部分函数依赖(满足1NF,表中的字段必须完全依赖于全部主键而非部分主键);

2024-02-15 09:00:00 862

原创 Leetcode 452. 用最少数量的箭引爆气球&435. 无重叠区间

两题非常像,452中弓箭的数量就相当于是435中非交叉区间的数量,只要把弓箭题目代码里射爆气球的判断条件加个等号(认为[0,1][1,2]不是相邻区间),然后用总区间数减去弓箭数量,就是要移除的区间数量。

2024-02-14 14:05:30 338

原创 使用Lambda表达式进行排序

【代码】使用Lambda表达式进行排序。

2024-02-14 12:03:36 510

原创 Leetcode 1005. K 次取反后最大化的数组和

第一次:让绝对值大的负数变为正数,当前数值达到最大,直到整个数组和达到最大;第三步:如果K还大于0,那么反复转变数值最小的元素,将k用完;第二次:k还是大于0,还要转变k次正负,让数组和达到最大。第二步:从前向后遍历,遇到负数将其变为正数,同时k–;第一步:将数组按照绝对值大小从大到小排序;

2024-02-12 14:09:40 539

原创 Leetcode 2641. 二叉树的堂兄弟节点 II

在层序遍历中,需要先创建一个队列,并将结点添加至队列中;接下来,若队列不为空,则遍历每一层即深度相同的节点,并将对应的val相加得到和sum,最后的结点值就是sum减去本结点值及其亲兄弟结点值啦!其实我们可以延申一下题意,怎样去计算该结点所有堂兄弟结点值的和?其实只需要先计算每一层所有结点的和,再减掉其本身的值和兄弟结点(如有)的值。本题为修改给定二叉树中结点的值,修改的规则为:将原来的值替换为该结点所有堂兄弟结点值的和。那么又怎样去计算每一层的结点值之和?

2024-02-08 09:00:00 379

原创 Leetcode 45. 跳跃游戏 II

十分类似,区别在于本题是要求出最小的跳跃次数。

2024-02-06 15:18:22 522

原创 Leetcode 55. 跳跃游戏

用一个覆盖范围cover来表示当前坐标元素所能跳跃到的距离范围;遍历在覆盖范围内的元素,一个个往后继续试它们的覆盖范围;直到覆盖范围中有最后一个元素位置,即可返回true;否则表示没有覆盖到最后一个元素,返回false。如果新的cover位置更远,就取代之;

2024-02-06 14:33:08 575

原创 服务端开发小记05——MySQL

MySQL是一个关系型数据库管理系统,目前属于Oracle旗下产品。MySQL所使用的SQL语言用于访问数据库的最常用标准化语言。其软件分为商业版和社区版,具有体积小,成本低,开源等等特点,适用于中小型网站的开发。

2024-01-29 14:24:25 595

原创 服务端开发小记04——Nginx

Nginx是一款轻量级Web服务器,也是一款反向代理服务器。Nginx可以直接支持Rails和PHP的程序,并且可以直接作为HTTP反向代理服务器。此外,Nginx还可以作为负载均衡服务器,邮件代理服务器,帮助实现前端动静分离等等。具有高稳定,高性能,资源占用少,模块化结构以便管理的特点。反向代理域名转发:假如把互联网比作一个大都市,那么局域网就好比是一个小乡村。在乡村里,有着各式各样的小店铺和住户,相互需要交流,互相帮助。

2024-01-29 13:15:52 539

原创 服务端开发小记03——vsftpd

vsftpd是“very secure FTP daemon”的缩写,是一个用于Linux环境下的免费开源的ftp服务器软件。vsftpd在Linux发行版中最受推崇,小巧轻快,安全易用,支持虚拟用户,支持带宽限制等功能。

2024-01-28 22:23:42 305

原创 服务端开发小记02——Maven

Apache Maven Project是一个apache的开源项目,是用于构建和管理Java项目的工具包。用Maven可以方便地创建项目,基于archetype可以创建多种类型的java项目;Maven仓库对jar包(artifact)进行统一管理,避免jar文件的拷贝重复和版本冲突;便于团队开发,Maven管理项目的RELASE和SNAPSHOT版本,方便多模块项目的各个模块之间的快速集成。

2024-01-28 21:55:20 540

原创 服务端开发小记01——Tomcat

Tomcat是一个Web容器,JavaEE程序可以在此运行。Tomcat是一个中间件,在B/S架构中,浏览器发出的http请求经过tpmcat中间件,转发到最终的目的服务器上,响应消息再通过tomcat返回给浏览器。tomcat做的事情主要有:开启监听端口监听用户的请求,解析用户发来的http请求然后访问到你指定的应用系统,然后你返回的页面经过tomcat返回给用户。

2024-01-28 21:18:20 933

原创 Leetcode 669. 修剪二叉搜索树

【代码】Leetcode 669. 修剪二叉搜索树。

2024-01-26 18:55:10 348

原创 Leetcode 450. 删除二叉搜索树中的节点

【代码】Leetcode 450. 删除二叉搜索树中的节点。

2024-01-26 14:22:47 485

原创 Leetcode 701. 二叉搜索树中的插入操作

有两个地方需要去考虑,一是插入前记录父节点的位置,二是记录上一个递归是左儿子还是右儿子。父节点位置可以用一个全局变量记录一下;至于是左儿子还是右儿子可以用一个flag表示。在确定下一层是null时,把当前节点记录,并且把应插在左还是右也记录。首先考虑树为空的情况,只要返回一个值为val的结点即可;

2024-01-25 13:54:53 403

原创 2859. 计算 K 置位下标对应元素的和

减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011。我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0。

2024-01-25 12:00:38 529

原创 Leetcode 2765. 最长交替子数组

题意为在给定数组中找满足不断+1再-1的子数组,并称为交替子数组。要求返回最长的交替子数组。

2024-01-23 13:30:17 595

原创 Leetcode 236.二叉树的最近共同祖先

空间复杂度:O(N),其中 N 是二叉树的节点数。递归调用的栈深度取决于二叉树的高度,二叉树最坏情况下为一条链,此时高度为 N,因此空间复杂度为 O(N),哈希表存储每个节点的父节点也需要 O(N) 的空间复杂度,因此最后总的空间复杂度为 O(N)。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。时间复杂度:O(N),其中 N 是二叉树的节点数。

2024-01-21 21:34:28 823

原创 Leetcode 2788. 按分隔符拆分字符串

我们可以先自己模拟一下分隔字符串的过程。如果只是简单的,遇到分隔符,将分隔符前后的子串加入结果的List,那么很显然并没有考虑到一个String中有多个字符串的情况。

2024-01-20 22:54:20 611

原创 Leetcode 106. 从中序与后序遍历序列构造二叉树

当寻炸右子树时,inorder需要的坐标范围为[i+1, postorder.length),postorder需要的坐标范围也为[i, postorder.length-1)。给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树。以根为中心,左边是左子树,右边是右子树。当寻找左子树时,inorder需要的坐标范围为[0, i),postorder需要的坐标范围也为[0, i);

2024-01-18 22:02:38 710 1

原创 Leetcode 82.删除排序链表中的重复元素Ⅱ

另外,在每一次迭代后,都会有删除或者没有删除两种情况,我们可以先用flag区分该次迭代有没有进行过删除操作,再分情况考虑每种情况到下一次迭代开始的指针归位操作,更有条理一些。本题的关键点在于不是单单删除重复的多余元素留下不重复的,而是要把重复的全部元素删除。这就导致在删除操作时,当指针指向的元素本身也需要删除时,需要记录一个前驱结点。所以在最开始我们就需要定义一个虚拟头结点dummyhead,用于后续的寻找前驱操作。

2024-01-16 09:30:00 462 1

原创 Leetcode 2591.将钱分给最多的儿童

给你一个整数 money ,表示你总共有的钱数(单位为美元)和另一个整数 children ,表示你要将钱分配给多少个儿童。请你按照上述规则分配金钱,并返回 最多 有多少个儿童获得 恰好 8 美元。如果没有任何分配方案,返回 -1。贪心算法,试着在满足每人至少1美元的前提下,尽可能地多分8美元,同时避开有人拿到4美元的情况。每个儿童至少获得 1 美元。所有的钱都必须被分配。没有人获得 4 美元。

2024-01-12 17:40:21 714

原创 Leetcode 144. 二叉树的前序遍历

遍历算法可选用递归或者迭代。按照访问根节点——左子树——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。递归与迭代在本质上是等价的,只不过递归的时候由系统隐式地维护了一个栈,而在迭代时需要把这个栈显示地模拟出来。空间复杂度:O(n)O(n)O(n),为递归过程中栈的开销,平均情况下为 O(log⁡n)O(\log n)O(logn),最坏情况下树呈现链状,为 O(n)O(n)O(n)时间复杂度:O(n)O(n)O(n),其中 nnn 是二叉树的节点数。

2024-01-09 15:11:41 721

原创 Leetcode 150.逆波兰表达式求值

原因在于这个简单是相对人类的思维结构来说的,对计算机而言中序表达式是非常复杂的结构。相对的,逆波兰式在计算机看来却是比较简单易懂的结构。还需注意的是:本题的逆波兰式为String类型数组,我们会遇到的是String类型的数字和操作符。2.当遇到运算符时,依次出栈栈顶两个元素,第一个元素为操作数2,第二个元素为操作数1;给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。5.重复上述步骤,当逆波兰式结束后,栈中最后一个数即为逆波兰式的运算结果。返回一个表示表达式值的整数。

2024-01-07 08:00:00 476 1

原创 Leetcode 20.有效的括号

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。很容易想到要用栈去进行后进先出方式的匹配。当遇见左括号时,将相应右括号入栈;遇见右括号时,则看是否与栈顶元素匹配即可。每个右括号都有一个对应的相同类型的左括号。左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。

2024-01-04 21:34:47 337 1

原创 Leetcode 225. 用队列实现栈

例如入队顺序是123,按照栈的弹出操作需要取3,而取3的唯一方法是先取出1和2。我们可以先分别将1和2取出放在队列末尾,此时不论是pop弹出栈顶还是top查询栈顶都可以取到3。所以我们可以先定义一个函数,用于将队列中除最后一个的所有元素全部移进队尾,这样原队尾元素就成为队头。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。用队列实现栈的关键,在于怎样去实现pop和top中仿照栈的后进先出操作。int top() 返回栈顶元素。

2024-01-04 17:08:44 402 1

原创 语音分离论文:Conv-TasNet:Surpassing Ideal Time–Frequency Magnitude Masking for Speech Separation

语音分离论文之:Conv-TasNet: Surpassing Ideal Time–Frequency Magnitude Masking for Speech Separation。

2024-01-03 22:33:53 2305 1

原创 LeetCode 459.重复的子字符串

代入上例中s=aabaab,str=aabaabaabaab,str中其实已经包含上述6个移位情况作为子串。所以只需要判断str 中去除首尾元素之后,是否包含自身元素。则表明存在重复子串。考虑到对于重复字符串很长的字符串,效率会非常低,可以采用另一种方式。若字符串s中包含了重复的子字符串,则该字符串通过不断移位操作总可以回到和原来一样位置。这样其实str中就包含了所有移动的字符串。六次移位后回到了初始位置。

2024-01-02 15:57:43 346

原创 Leetcode 28. 找出字符串中第一个匹配项的下标

如果不匹配,外循环haystack的下标+1,继续往后寻找可能匹配的子串头,此时flag置为false,表示还在寻找正确的子串;如果匹配,内循环子串needle的下标+1,并将flag置true,表示当前的匹配没有问题,继续尝试子串后续是否匹配。如果出循环的flag依然为true,表示子串匹配无误,此时返回的外循环偏移量i即为所求坐标。对于长串haystack,我们可以遍历haystack,求其与子串的下标偏移值i。对于子串needle,遍历之,判断在haystack偏移i的情况下是否匹配。

2024-01-01 23:18:38 354

原创 使用Lambda表达式进行排序

【代码】使用Lambda表达式进行排序。

2024-01-01 15:48:28 1204

原创 语音分离论文:Dual-Path RNN

论文标题:Dual-Path RNN: Effective Long Sequence Modeling for Time-Domain Single-Channel Speech Separation。

2023-12-24 22:46:58 1800 3

原创 LeetCode.18四数之和

在三数之和的基础上,增加一个数的求和,只需要添加一个外层指针即可。三数循环中,i为外层指针,left和right负责在后面挨个寻找并比较;四数循环中,自然是在i后加一个j指针,然后继续沿用left和right即可。十分类似,只需要略作修改即可。建议小伙伴们先看三数之和哦。

2023-12-23 18:01:48 424 1

原创 LeetCode.15三数之和

毕竟是三数相加,比之前的四数总是有简单一些的地方吧!我们可以尝试用三个指针来试试。我一开始想到的是用哈希解法。模仿四数相加的解法,为避免暴力循环,先将两数相加,丢进hashset中,再去考虑第三个数相加为0。但细看本题没有这么简单,原因在于三元组下标不能相等,且需要不重复的三元组!本题还有一个特殊要求,就是三元组不可重复。如果按照上面的算法逐一查找,三元组中的某数在整个数组中多次出现,则三元组必然会出现重复。所以在上述算法中,需要设法去除重复。依照这个思路,便最终可以实现双循环找到所有三数之和为0的情况。

2023-12-23 01:24:30 343 1

原创 LeetCode. 383 赎金信

题意是要求a字符串的每个字符完全包含在b字符串中,即使是相同字符,a中出现的次数也需要小于等于b中出现的次数。

2023-12-21 21:50:35 359

原创 基于DPRNN的信号分离任务(科研小记)

信号分离与重建任务在深度学习领域已经取得了长足进步。特别是在纯语音分离领域,深度聚类方法和置换不变训练方法为语音分离的起步夯实了基础。在传统的信号分离任务中,基于时频域的信号分离需要将信号进行短时傅里叶变换,将时域信号转换为时频域信号。因为时频域信号更易于提取语音特征,例如基于人耳听觉的特征MFCC等。同时,经过短时傅里叶变换的时频域信号容易通过逆傅里叶变换重建为时域信号。而基于时域的信号分离需要搭建一个编码器-解码器的端到端模型。其中编码器将时域信号映射成高位特征向量,而解码器会重建分离的信号特征。

2023-12-21 17:46:36 2183

原创 Leetcode.454 四数相加II

由于最终和为0,只需要第二个双循环求的和为-sum就可以啦,并不需要再来一个HashMap了。由于既要求和,又需要记录每一种和对应的次数,联想到键值对,我们可以用HashMap试一试。空间复杂度: O(n^2), 最坏情况下nums1和nums2的值各不相同,相加产生n平方个不同的sum。第一个双循环,把所有求到的和sum丢到HashMap中,key为和的值,value为该和出现的次数;用第一个双循环求nums1+nums2的和sum,第二个双循环求num3+num4的和。时间复杂度: O(n^2)

2023-12-21 16:24:43 389

空空如也

空空如也

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

TA关注的人

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