- 博客(288)
- 收藏
- 关注
原创 RTSP协议简单实现
RTSP是一个实时传输流协议,是一个应用层的协议。通常说的RTSP 包括RTSP协议、RTP协议、RTCP协议,对于这些协议的作用简单的理解如下:负责服务器与客户端之间的请求与响应: 负责服务器与客户端之间传输媒体数据:负责提供有关RTP传输质量的反馈,就是确保RTP传输的质量三者的关系:。rtp和rtcp并没有规定传输层的类型,可以选择udp和tcp。Rtsp的传输层则要求是基于tcp。
2025-03-31 17:44:35
233
原创 C++并发三剑客:future、promise和async
std::future::get() 是一个阻塞调用,用于获取 std::future 对象表示的值或异常。std::future::wait() 也是一个阻塞调用,但它与 get() 的主要区别在于 wait() 不会返回任务的结果。在上面的示例中,我们创建了一个包装了任务的std::packaged_task对象,并获取了与任务关联的std::future对象。最后,我们输出结果。:这种策略意味着任务将在调用std::future::get()或std::future::wait()函数时延迟执行。
2024-11-20 16:33:37
787
原创 C++实现归并排序
归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组。:通过递归的方式,不断地将数组一分为二,直到每个子数组只有一个元素(此时视为有序)。:将两个有序子数组合并成一个有序数组。
2024-09-02 20:52:03
528
原创 C++实现快速排序
它的基本思想是通过一组排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据小,然后再按此方法对这两部分数据进行快速排序,整个排序过程可以递归进行,以此使所有数据变成有序序列。治理:求解各个子问题。步骤二:从右向左扫描,找到小于等于 pivot 的数,如果找到,R[i] 和 R[j] 交换 ,i++。步骤三:从左向右扫描,找到大于 pivot 的数,如果找到,R[i] 和 R[j] 交换,j–。合并:按原问题的要求,将子问题的解逐层合并构成原问题的解。快速排序,是一种分治算法。
2024-08-30 10:10:56
506
原创 C++设计模式
文章目录工厂方法模式抽象工厂模式单例模式代理模式外观模式适配器模式模板方法模式策略模式命令模式观察者模式装饰模式桥模式设计的7大原则:开闭原则:软件实现应当对扩展开放,对修改关闭。里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立。依赖倒置原则:高层模块不应该依赖低层模块,两则都应该依赖其抽象;抽象不应该依赖细节, 细节应该依赖抽象。单一职责原则:一个类应该有且仅有一个引起他变化的原因,否则类应该被拆分接口隔离原则:一个类对另一个类的应该建立在最小的接口上迪米特法则:最少知识原则合
2024-06-26 14:10:24
1172
原创 LeetCode347:前K个高频元素
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
2024-06-17 10:39:02
319
原创 MYSQL基础操作
连接查询内连接:相当于查询A、B交集部分数据外连接:左外连接:查询左表所有数据,以及两张表交集部分数据右外连接:查询右表所有数据,以及两张表交集部分数据自连接:当前表与自身的连接查询,自连接必须使用表别名。
2024-06-14 14:33:41
704
原创 LeetCode84:柱形图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1。求在该柱状图中,能够勾勒出来的矩形的最大面积。
2024-06-01 11:19:28
299
原创 LeetCode503:下一个更大元素Ⅱ
给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素。数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。
2024-05-31 16:33:19
280
原创 LeetCode496:下一个更大元素Ⅰ
对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素。如果不存在下一个更大元素,那么本次查询的答案是 -1。给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。hashmap+单调栈。
2024-05-31 10:46:23
279
原创 LeetCode739:每日温度
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
2024-05-30 10:21:50
325
原创 LeetCode516:最长回文子序列
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
2024-05-29 10:50:10
437
原创 LeetCode647:回文子串
给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。子字符串 是字符串中的由连续字符组成的一个序列。回文字符串 是正着读和倒过来读一样的字符串。
2024-05-29 10:27:05
274
原创 LeetCode72:编辑距离
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数。增加:对word1增加一个,可以对应为把word2删除一个 dp[i][j] = dp[i][j-1]+1。替换:dp[i][j] = dp[i-1][j-1]+1;删除:dp[i][j] = dp[i-1][j]+1。
2024-05-29 09:11:37
261
原创 TCP:传输控制协议
除非我们在实行半关闭,否则将等待另一端的应用层意识到它已收到一个文件结束符说明,并向我们发一个FIN来关闭另一方向的连接。当窗口右边沿向右移动时将允许发送更多的数据,我们称之为窗口张开。这种现象发生在另一端的接收进程读取已经确认的数据并释放了TCP的接受缓存时。拥塞窗口cwnd的维护原则:只要网络没有出现拥塞,拥塞窗口就再增大一些;也有的快恢复实现是把快恢复开始时的拥塞窗口cwnd值再增大一些,即等于新的ssthresh + 3。,就将相应的报文段立即重传,而不是等待该报文段的超时重传计数器超时再重传。
2024-05-28 11:37:06
1527
原创 LeetCode583:两个字符串的删除操作
给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。每步 可以删除任意一个字符串中的一个字符。解法2:利用最长公共子序列。
2024-05-28 10:13:58
233
原创 LeetCode115:不同的子序列
给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 109 + 7 取模。
2024-05-28 09:42:47
240
原创 LeetCode392:判断子序列
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
2024-05-25 10:15:30
193
原创 LeetCode1143:最长公共子序列、1035:不相交的线
一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。
2024-05-24 10:43:29
138
原创 Effective C++(6)
非虚函数执行的是静态绑定又称前期绑定,early binding),由对象类型本身(称之静态类型)决定要调用的函数;而虚函数执行的是动态绑定又称后期绑定,late binding),决定因素不在对象本身,而在于“指向该对象之指针”当初的声明类型(称之动态类型)。l’;k前面我们已经说过,public继承意味着 is-a 关系,而在基类中声明一个非虚函数将会为该类建立起一种不变性(invariant),凌驾其特异性(specialization)。
2024-05-23 15:44:31
683
原创 LeetCode674:最长连续递增序列
连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], …, nums[r - 1], nums[r]] 就是连续递增子序列。给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
2024-05-23 10:35:36
309
原创 LeetCode300:最长递增子序列
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的。给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
2024-05-23 10:26:16
296
原创 Effective C++(5)
当变量定义出现时,程序需要承受其构造成本;当变量离开其作用域时,程序需要承受其析构成本。因此,避免不必要的变量定义,以及延后变量定义式直到你确实需要它。// 效率低// 效率高这种做法产生的开销:1 个构造函数 + 1 个析构函数 + n 个赋值操作Widget w;i < n;++i) {w = 取决于 i 的某个值;...这种做法产生的开销:n 个构造函数 + n 个析构函数i < n;++i) {Widget w(取决于 i 的某个值);...
2024-05-22 20:21:15
1035
原创 Effective C++(4)
注意,虽然成员函数和非成员函数都可以完成我们的目标,但此处更建议使用非成员函数,这是为了遵守一个原则:越少的代码可以访问数据,数据的封装性就越强。此处在传参时,调用了基类Window的拷贝构造函数而非派生类的拷贝构造函数,因此在函数种使用的是一个Window对象,调用虚函数时也只能调用到基类的虚函数Window::Display。这个原则对于友元函数也是相同的,因为友元函数和成员函数拥有相同的权力,所以在能使用非成员函数完成任务的情况下,就不要使用友元函数和成员函数。
2024-05-22 15:04:34
730
原创 LeetCode714:买卖股票的最佳时机含手续费
给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格;整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。返回获得利润的最大值。
2024-05-22 10:58:41
308
原创 LeetCode309:买卖股票的最佳时机含冷冻期
设计一个算法计算出最大利润。给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
2024-05-22 10:38:43
232
原创 LeetCode188:买卖股票的最佳时机Ⅳ
给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
2024-05-22 09:49:28
149
原创 Effective C++(3)
以对象管理资源对于传统的堆资源管理,我们需要使用成对的new和delete,这样若忘记delete就会造成内存泄露。因此,我们应尽可能以对象管理资源,并采用RAII(Resource Acquisition Is Initialize,资源取得时机便是初始化时机),让析构函数负责资源的释放。原书此处提到的auto_ptr的内容已经过时,在 C++11 中,通过专一所有权来管理RAII对象可以使用std::unique_ptr,通过引用计数来管理RAII对象可以使用std::shared_ptr。
2024-05-21 19:44:31
1167
原创 C++智能指针
在C++11中通过引入智能指针的概念,使得C++程序员不需要手动释放内存智能指针的种类3)weak_ptrauto_ptr已经被废弃。
2024-05-21 16:25:56
421
原创 LeetCode123:买卖股票的最佳时机Ⅲ
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
2024-05-21 10:52:48
199
原创 Effective C++(2)
当派生类对象经由一个基类指针被删除,而该基类指针带着一个非虚析构函数,其结果是未定义的,可能会无法完全销毁派生类的成员,造成内存泄漏。在派生类对象的基类构造和析构期间,对象的类型是基类而非派生类,因此此时调用虚函数会被编译器解析至基类的虚函数版本,通常不会得到我们想要的结果。在创建派生类对象时,基类的构造函数永远会早于派生类的构造函数被调用,而基类的析构函数永远会晚于派生类的析构函数被调用。虚析构函数的运作方式是,最深层派生的那个类的析构函数最先被调用,然后是其上的基类的析构函数被依次调用。
2024-05-21 09:33:38
834
原创 Effective C++(1)
1)#define 修饰的记号,在预处理的时候,已经全部被替换成了某个数值,如果出错,错误信息可能会提到这个数值,而不会提到这个记号。但是有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员应该被mutable来修饰。需要注意的是,反向做法:令const版本调用non-const版本以避免重复——并不被建议,一般而言const版本的限制比non-const版本的限制更多,因此这样做会带来风险。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。
2024-05-20 16:02:21
690
原创 LeetCode121:买卖股票的最佳时机
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0。
2024-05-20 10:30:35
248
原创 LeetCode337:打家劫舍Ⅲ
除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。给定二叉树的 root。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额。小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root。
2024-05-20 09:50:30
299
原创 LeetCode213:打家劫舍Ⅱ
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。
2024-05-18 10:23:34
260
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人