自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 148. 排序链表【归并排序】【C++】

合并两个有序链表,其次就是考虑好,找到要合并的两个链表的位置。

2024-11-07 00:50:54 306

原创 88. 合并两个有序数组【双指针】【C++】

实现部分(双指针):使用三个指针,即i指向nums1有数据的尾部(m-1),j指向nums2的尾部(n-1),k指向nums1尾部(m+n-1),比较i和j指向数字大小,将大的赋值给小标k处,然后同时向前移动。输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3。合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。输入:nums1 = [0], m = 0, nums2 = [1], n = 1。

2024-11-05 17:18:28 874

原创 【C/C++语言系列】实现单例模式

单例模式是一种常见的设计模式,我们需要掌握它,一个补充,单例对象在main函数调用之前生成了(静态变量在编译阶段就分配了内存)

2024-09-21 01:13:35 504

原创 【C/C++语言系列】C语言的malloc、free和C++的new、delete异同

这里简单说下:malloc、calloc、realloc函数申请的内存。可以看出C++的new操作符包含了malloc的。

2024-09-21 00:29:42 416

原创 【C/C++语言系列】浅拷贝和深拷贝

重新在堆区创建一块内存,它们的指向不同,单指向的内容相同,这样在析构时分别释放自己的堆区数据。:如果有数据创建在堆区,那么在析构时会出现重复析构的问题。,它们各自都调用析构函数就会造成堆区数据重复释放。浅拷贝和深拷贝在面试中经常被问,十分重要。:使用深拷贝去解决堆区数据重复释放的问题。:这样两个m_height指针。

2024-09-20 23:57:39 441

原创 101. 对称二叉树【同时遍历两棵树】【C++】

后序遍历:一般是从叶子节点返回信息,所以有这个特性就可以考虑后序遍历。

2024-09-19 08:50:16 294

原创 二叉树的遍历【C++】

对于二叉树系列的题,必须要会二叉树。什么序是指处理根节点在哪个位置,比如前序是指处理节点顺序:根左右。接下来要说明的是:选用实现还是实现,一般来说递归法和迭代法可以相互转化。常常使用栈或者队列来实现。

2024-09-19 00:41:25 520

原创 【C/C++语言系列】malloc、calloc和realloc区别和用法

以前的size,那么就会缩减,如果继续访问不在缩减后的地址,会报错。分配,那么会重新找一块内存,把原来的值复制过来,返回新地址。空间分配newsize个地址,返回原地址;以前的size,分两种情况:原地址后面有。num_nytes:要开辟的内存字节数。功能:修改以前在堆区分配过的内存大小。newsize:修改后的字节数。返回值:修改内存大小后的地址。功能:堆区开辟一段内存空间。返回值:新开辟内存的首地址。功能:堆区开辟一段内存空间。返回值:新开辟内存的首地址。size:每个数的字节数。

2024-09-18 23:37:23 444

原创 【C/C++语言系列】指针数组、数组指针、函数声明和函数指针区别

结合还是[]结合 ,在C语言中,运算符的优先级为() == [] > *,结合性都是从左到右。p[10]是一个数组,因为p先于[]结合,而int(*p) [10]是一个指针。指向一个大小为10的int数组,该数组名未知。函数名p,返回值类型int*,参数类型int*该函数返回值类型int,参数类型int*数组中存的10个数都是int*类型的。p是一个指针,指向一个匿名函数,同上面一样,依然看优先级。

2024-09-18 19:59:31 471

原创 集群聊天服务器项目【C++】(六)MySql数据库

本章比较简单,编写了数据模块代码,并更新了相关的CMakeLists.txt文件。

2024-09-17 00:39:46 614

原创 集群聊天服务器项目【C++】(五)网络模块和业务模块

这是本项目的关键一章,网络模块怎么使用回调函数完成新链接和消息的回调,以及怎么解耦网络模块和业务模块等,在后面章节,大部分只是在此基础上增加业务功能,网络模块就不需要改了。

2024-09-16 17:38:19 1015

原创 集群聊天服务器项目【C++】(四)cmake介绍和简单使用

本章介绍了为什么使用cmake:比手写Makefile简单,cmake安装、vscode配置,以及用cmake编译上一章的代码。但是对于一个复杂的项目,使用cmake还需要其他额外的配置,后面会再详细介绍。

2024-09-15 10:11:59 565

原创 集群聊天服务器项目【C++】(三)muduo库的简单介绍

muduo库顶层就是epoll(IO复用技术) + Linux的pthread多线程,所以只能安装在Linux系统中。此外它依赖Boost库,相关的安装已经在我的博客中写出环境配置。muduo 的线程模型为「one loop per thread + threadPool」模型。一个线程对应一个事件循环(EventLoop),也对应着一个 Reactor 模型。EventLoop 负责 IO 和定时器事件的分派。其中有 mainReactor 和 subReactor。

2024-09-14 19:47:40 1311

原创 集群聊天服务器项目【C++】(二)Json的简单使用

Json是一种轻量级的数据交换格式(也叫数据序列化方式)。Json采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 Json 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。在网络传输中,一般有3中常见的序列化格式:XML,Json、ProtoBufProtoBuf:数据压缩编码传输,占用带宽小,复杂Json:相比与ProtoBuf更简单,但性能差一点XML:性能差本项目使用Json完成网络数据的序列化与反序列化。

2024-09-14 16:21:49 762

原创 集群聊天服务器项目【C++】项目介绍和环境搭建

在 Linux 环境下基于 muduo 开发的集群聊天服务器。实现新用户注册、用户登录、添加好友、添加群组、好友通信、群组聊天、保持离线消息等功能。本文简单介绍了该项目的内容、技术栈、需求和目标,然后着重介绍了环境的安装配置,有个别目前用不上,到后面再安装。希望本次环境安装能给大家一点帮主。

2024-09-14 11:52:52 1420

原创 41缺失的第一个正数【力扣】【C++】

第二部:每个正数放好位置后,再次遍历,如果小标i对应的值不是i + 1就找到结果i+1。第一步:将数组变成排好序的数组,我们可以将每个正数i放在下标i - 1上面。其中nums[i]!= nums[nums[i] - 1]是为了防止死循环。给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。由于不能建立哈希表,所以只能在原数组上操作,以保证空间复杂度O(1)。输入:nums = [7,8,9,11,12]输入:nums = [3,4,-1,1]输入:nums = [1,2,0]

2024-08-04 11:19:17 487

原创 125. 验证回文串【C++】【双指针】

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。给你一个字符串 s,如果它是 回文串 ,返回 true;输入: s = “A man, a plan, a canal: Panama”解释:“amanaplanacanalpanama” 是回文串。解释:在移除非字母数字字符之后,s 是一个空字符串 “”。由于空字符串正着反着读都一样,所以是回文串。解释:“raceacar” 不是回文串。输入:s = “race a car”输入:s = " "

2024-08-03 23:26:52 315

原创 74. 搜索二维矩阵【二分法】【C++】

1的一维数组,最中间的数mid是5((0+12-1) / 2 == 5),对应二维数组行数1(5 / 4==1),列数5(5 % 4 == 1)。输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13。输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3。本题是二分搜索的变形,常规的二分搜索是一个一维数组,而本题是一个。,但是依然可以使用一维数组的思路,

2024-07-05 23:44:18 464

原创 203. 移除链表元素【链表】【C++】

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。就是跳过下一个的节点,直接和下一个的下一个节点相连,但需要注意,C++需要手动释放内存。输入:head = [1,2,6,3,4,5,6], val = 6。输入:head = [7,7,7,7], val = 7。列表中的节点数目在范围 [0, 104] 内。输入:head = [], val = 1。时间复杂度O(n):遍历一遍链表。输出:[1,2,3,4,5]

2024-06-27 10:06:20 351

原创 904. 水果成篮【滑动窗口】【C++】

考虑滑动窗口,用一个哈希表存贮窗口内出现数字的次数,当哈希表出现的个数为3时,窗口左侧收缩,并且对应的个数减1,如果某个数字的次数为0时,删除对应的元素。输入:fruits = [3,3,3,1,2,1,1,2,3,3,4]如果从第一棵树开始采摘,则只能采摘 [1,2] 这两棵树。解释:可以采摘 [1,2,1,1,2] 这五棵树。输入:fruits = [1,2,3,2,2]解释:可以采摘 [2,3,2,2] 这四棵树。输入:fruits = [0,1,2,2]解释:可以采摘 [1,2,2] 这三棵树。

2024-06-26 20:33:38 373

原创 844. 比较含退格的字符串【栈】【C++】

使用两个指针分别指向两个字符串的末尾,从后往前遍历字符串,遇到’#‘就删除一个元素,直到当前没’#',然后比较当前字母。生成去掉’#‘后的字符串:使用栈(字符串来模拟)来完成,遇到’#‘且栈非空就出栈,不是’#'就入栈。分别生成两个字符串,然后比较两个字符串是否相等(时间复杂度O(n))。输入:s = “ab#c”, t = “ad#c”输入:s = “ab##”, t = “c#d#”解释:s 会变成 “c”,但 t 仍然是 “b”。输入:s = “a#c”, t = “b”

2024-06-26 11:04:26 361

原创 283. 移动零【快慢指针】【C++】

数组、链表等线性结构删除元素一般都是用快慢指针的方法,快指针一般用于遍历,对于满足要求的元素赋值给慢指针。给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。类似,第一步都是删除元素,只是本题多了一步,在数组后面补零。请注意 ,必须在不复制数组的情况下原地对数组进行操作。输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0]空间复杂度O(1):常数个变量。输入: nums = [0]时间复杂度O(n):遍历数组。

2024-06-26 10:07:22 376

原创 26. 删除有序数组中的重复项【双指针】【C++】

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2。输入:nums = [0,0,1,1,1,2,2,3,3,4]

2024-06-26 09:47:53 214

原创 383. 赎金信【哈希表】【C++】

然后遍历magazine 数组,在哈希表上减,如果出现了负数则为返回false。给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。输入:ransomNote = “aa”, magazine = “aab”输入:ransomNote = “aa”, magazine = “ab”magazine 中的每个字符只能在 ransomNote 中使用一次。输入:ransomNote = “a”, magazine = “b”

2024-06-26 09:35:57 224

原创 242. 有效的字母异位词【哈希表】【C++】

分别用两个哈希表存每个字母出现的次数:即key–字母,value–出现次数,如果两个哈希表相同则是异位词。不需要两个哈希表,第二个出现的字母在第一个哈希表上减,最后再遍历哈希表,都为0则是异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。输入: s = “anagram”, t = “nagaram”输入: s = “rat”, t = “car”空间复杂度O(1):无额外空间。

2024-06-25 23:54:02 222

原创 122. 买卖股票的最佳时机 II【C++】【贪心法】【动态规划法】

思路:由于可以当天卖出后当天买入,所以我们可以进行拆分如:price[3] - price[0] = (price[3] - price[2]) + (price[2] - price[1]) + (price[1] - price[0])解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。区别在于能不能多次购买,所以昨天不持有股票而今天买入股票为dp[i - 1][1] - prices[i]。

2024-06-12 15:51:11 444

原创 买卖股票的最佳时机【C++】

买卖股票的最佳时机有很多变形题,他们有的可以暴力、贪心等方法求解,但是都可以用动态规划的思路进行求解,需要重点掌握。

2024-06-11 10:48:47 775

原创 343. 整数拆分【贪心】【动态规划】【C++】

想要拆分的整数乘积最大,尽量多拆成几个整数,但拆成几个整数合适?不能继续拆分的整数我们从小到大分析,2和3拆分会变小,4拆分不变。选择不能拆分的最大值3作为拆分的最小单元,但剩下的4不能拆分为3*1。给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。8 = 3 + 3 + 2(不能3 + 5,5拆分会变大)解释: 2 = 1 + 1, 1 × 1 = 1。输入: n = 10。

2024-06-06 20:31:57 407

原创 不同路径相关问题【C++】【动态规划】

不同于第一题,本题加入了障碍,但是(i,j)的路径数依旧由(i-1,j)和(i,j-1)有关,所以依旧考虑使用动态规划方法,只是需要修改递归公式等内容。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]现在考虑网格中有障碍物。输入:obstacleGrid = [[0,1],[0,0]]

2024-06-01 14:29:22 1593

原创 爬楼梯相关问题

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。到第i层的花费与i-1层的花费和i-2层的花费有关,因此本题也可以尝试使用动态规划方法。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。i-1层的最小花费和i-2层最小花费的最小值。只循环使用了3个变量,因此可以不用n维数组。解释:你将从下标为 1 的台阶开始。解释:有两种方法可以爬到楼顶。解释:有三种方法可以爬到楼顶。

2024-05-30 21:02:05 1362

原创 斐波那契数【C++】【多解法】

递归法:从上到下计算动态规划:从下到上计算。

2024-05-29 10:42:32 457

原创 151. 反转字符串中的单词【C++】

输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。s 中使用至少一个空格将字符串中的 单词 分隔开。解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。给你一个字符串 s ,请你反转字符串中 单词 的顺序。解释:反转后的字符串中不能存在前导空格和尾随空格。输入:s = “a good example”

2024-05-28 11:24:50 386

原创 541. 反转字符串 II【C++】

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。如果剩余字符少于 k 个,则将剩余字符全部反转。输入:s = “abcdefg”, k = 2。输入:s = “abcd”, k = 2。输出:“bacdfeg”s 仅由小写英文组成。

2024-05-28 10:21:54 338

原创 打家劫舍【动态规划】

因为当前值与以前值有关,所以可以尝试动态规划。动态规划每道题都可以用这5步进行解决,每一步都很重要。代码随想录。

2024-05-22 13:37:13 274 1

原创 344.反转字符串(C++)

使用reverse()函数直接反转,但这题比较简单,不推荐使用。

2024-05-17 09:10:38 586 1

原创 pytorch的Dataset和Dataloader的简单使用

其余很多参数不常用,比如设置采样的规则、数据集不够分时最后一个batch丢不丢等等。Dataset类:可以根据id索引出单个的数据,还可以进行一些预处理。batch_size:多少个数据组成一个整体,越大对内存要求更高。dataset:传入训练集或者验证集(Dataset对象)。shuffle:训练集一般设为True,验证集为False。,可以自己添加一些预处理的函数,比如划分训练集、验证集。Dataloader类:将数据集进行打包成迭代器。:将数据集按batch进行打包。

2024-05-16 20:53:16 279

原创 JZ81 调整数组顺序使奇数位于偶数前面(二)(C++)

3.再次遍历原数组,是奇数就从res数组的下标0开始赋值,偶数就放在index开始赋值。2.第一个指针向后移动,遇到偶数就停下,第二个指针向前移动到奇数就停下,然后交换两个数。1.然后使用双指针,一个指向数组首,一个指向数组尾。3.重复步骤3,知道第一个指针大于第二个指针。1.首先遍历一遍数组,确定奇数个数index。2.创建一个结果数组res。

2024-05-14 20:22:37 195 2

原创 977.有序数组的平方(C++)

两侧指针的平方一定大于中间的平方,所以两侧向中间以动就行。时间复杂度:快速排序,O(nlogn)空间复杂度O(n):创建了一个辅助数组。时间复杂度O(n):遍历一遍数组。空间排序:原数组操作,O(1)

2024-05-14 09:08:21 241 1

原创 数组:移除元素(C++)

遍历数组每一个元素,如果这个值和目标值相等,则删除该元素。但是数组因为是连续的,所以需要遍历的将后一个值赋给前一个值。因此有两层遍历,时间复杂度O(n^2)、空间复杂度O(1)对于数组、链表、字符串等数据结构,我们常常使用双指针的方法。双指针中的快慢指针最为合适,其中慢指针指向当前马上添加的位置,快指针去遍历数组。不能i < nums.size(),因为要遍历完原数组长度,而不是变化中的数组。删除数组元素也可以使用erase方法,时间复杂度是一样的。

2024-05-13 15:00:50 2248

原创 54. 螺旋矩阵

首先怎么判断可能剩一行还是一列?行数<列数就是剩一行,大于也同理。等于可以任意归为一类,比如3*3的矩阵。,依然同样的模拟方式,但区别是行数和列数不等。比如最后可能剩一列或者一行,需要单独处理。其次怎么判断是否有剩余?取行数和列数的最小值,如果满足以下就说明有剩,需要单独处理。

2024-05-13 14:35:47 230

空空如也

空空如也

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

TA关注的人

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