自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++问题:深拷贝和浅拷贝

用一个对象初始化一个新的对象,拷贝构造函数是把对象当作参数传入,利用传入的对象生成一个新的对象,赋值运算符是将对象的值赋值给一个已经存在的实例。调用的是拷贝构造函数还是赋值运算符,主要看是否有新的对象产生。编译器默认的拷贝构造函数是浅拷贝构造函数,它只会复制一个一模一样的指针,并不会操作指针指向的东西,要实现自己的逻辑需求,就要自定义拷贝构造函数,实现深拷贝。浅拷贝和深拷贝的区别在于两个指针变量指向的是一块空间还是指向不同的空间,如果没有创建内存的操作就是浅拷贝,否则是深拷贝。

2025-06-19 20:56:28 121

原创 C++问题:纯虚函数和抽象类

虚函数” 是概念名称:它描述的是这种函数的行为特性——支持通过基类指针或引用在运行时动态绑定到实际对象所属派生类的实现(即运行时多态)。(3)一个普通的虚函数在虚函数表中其函数指针是一个有意义的值,如果是一个纯虚函数,在虚函数表中,其函数指针的值就是0。virtual 是关键字:你在基类中声明一个函数时,使用 virtual 关键字修饰它,这个函数就成为了虚函数。(2)如果父类中一个虚函数自身的实现无意义,此时可以将该虚函数定义为纯虚函数。(1)纯虚函数就是没有函数体,同时在定义时,在函数名后加=0。

2025-06-15 20:34:35 214

原创 OS问题:线程与进程的比较

同一个进程内的线程切换比进程切换快,因为线程具有相同的地址空间(虚拟内存共享),这样同一个进程的线程拥有同一个页表,不需要切换,而不同的进程之间切换,需要切换页表,页表的切换开销过程是比较大的。线程的创建时间比进程快,因为进程在创建的过程中,还需要资源管理信息(内存管理信息,文件管理信息等),而线程不涉及这些,而是共享。进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈。线程的终止时间比进程快,因为线程释放的资源比进程少很多。进程是资源分配的单位,线程是CPU调度的单位。

2025-06-04 15:07:42 154

原创 OS问题:什么是进程,进程的通信方式有哪些

我们编写的代码只是一个存储在硬盘的静态文件,通过编译后就会生成二进制可执行文件,当运行这个可自行文件后,它会被装载到内存中,接着CPU会执行程序中的每一条指令,这个运行中的程序,就是进程。消息队列是保存在内核中的消息链表,在发送数据时,会分成一个个独立的数据单元(消息体),是用户自定义的数据类型,消息体有一个最大长度限制,全部消息体的总长度也是有上限。V操作:这个操作会把信号量加上1,相加后如果信号量<=0,则表明当前有阻塞中的进程,于是会将该进程唤醒运行;整型的计数器,用于实现进程间的互斥与同步。

2025-06-04 14:08:09 201

原创 MySQL问题:count(*)与count(1)有什么区别

如果表里只有主键索引,没有二级索引时,InnoDB循环遍历主键索引,将读取到的记录返回给Server层,但是不会读取记录中的任何字段的值,因为count函数的参数是1,不是字段,所以不需要读取记录中的字段值。Count(*)其实等于count(0),使用Count(*)时,MySQL将*参数转化为参数0。Count(1)执行效率会比Count(主键字段)高一点的原因:就是不需要读取记录中的字段值。Count(*)=count(1)>count(主键字段)>count(字段)Count(1)查询过程。

2025-06-02 15:07:18 383

原创 MySQL问题:MySQL中主要的锁都有啥?

比如:此时要上表级别的S锁,如果表上没有IX,就说明表中没有独占锁,直接上表级S锁。此时要上表级X锁,如果表上没有IX和IS,就说明表中记录都没加锁,直接上表级X。Next-Key Lock称为临键锁,是记录锁和间隙锁的结合,锁定一个范围,并且锁定记录本身,临键锁不是兼容的。只有在释放共享锁后,其他事务才能获得排它锁。Record Lock称为记录锁,锁住的是一条记录,记录锁分为S锁和X锁(读锁和写锁)排他锁:只允许一个事务对资源进行读写,其他事务在获得排它锁之前无法访问该资源。

2025-05-28 19:55:26 342

原创 MySQL问题:MVCC是什么?

1.如果trx_id<min_trx_id,代表这个记录是在创建ReadView前就提交的事务生成的,所以该版本的记录对当前事务可见。2.trx_id>=max_trx_id,代表是创建ReadView后才启动的事务生成的,所以该版本的记录对当前事务不可见。3.min_trx_id<trx_id<max_trx_id,也就是在之间,当trx_id在m_ids中不可见,不在则可见。min_trx_id:当前数据库中“活跃事务”中事务id最小的事务。Max_trx_id:当前数据库中应该给下一个事务的id值。

2025-05-28 19:22:30 879

原创 MySQL问题:索引失效

原因:索引列存在NULL会导致优化器在做索引选择时会复杂,NULL会使索引统计和值比较复杂,如count会省略值为NULL行。NULL值没有意义,还会占用物理空间,带来存储空间的问题,如InnoDB存储记录时,至少会用1字节空间存储NULL值列表。当使用左或者左右模糊匹配时,like%XX或者like%XX%都会导致失效。在where字句中,or前的条件列是索引列,而or后的不是。当查询条件会索引列做计算、函数、类型转换操作也会失效。设置NOTNULL约束。

2025-05-28 13:42:52 109

原创 MySQL问题:什么是MySQL的中的最左匹配原则?

是指在复合索引中,查询条件需要按照索引列的顺序从最左侧列开始依次匹配。只有查询条件中的列按照索引的最左边列开始进行匹配,索引才能被有效使用,但有时虽然不是正常顺序,由于MySQL中存在优化器,会自动调整顺序,依旧能使用索引。如果遇到>=、between、like等范围查询,则不会停止匹配,原因:这些查询包含一个凳子判断,这样可以直接定位到某个数据,然后往后扫描即可。例如:联合索引(a,b,c)在B+Tree中的排序是:先按a的值排序,如果a的值相同的,则按b的值排序,如果b的值相同,在按c的值排序。

2025-05-27 21:13:00 369

原创 MySQL问题:MySQL中使用索引一定有效吗?如何排查索引效果

首先可以使用Explain语句来查看查询的执行计划,确认是否使用了正确的索引,其次可以检查是否违反最左匹配原则的情况,调整查询条件的顺序。优化措施包括减少返回的列数,使用覆盖索引。使用功能Explain命令,使用命令后观察Explain结果中的type(访问类型)、key(使用的索引)、rows(扫描的行数)等。当查询使用索引时,Type一般显示未index或range,如果是ALL,就表示查询执行了全表扫描,没使用索引。使用索引时,Key会显示索引名称,如果是NULL,就表示查询没使用索引。

2025-05-27 20:47:41 589

原创 MySQL问题:主要索引类型(聚簇、辅助、覆盖、前缀)

使用覆盖索引,如果一个索引(通常是辅助索引)包含了查询中需要的所有字段,那么数据库可以直接通过该索引返回结果,而无需回表,这种索引称为覆盖索引。主键索引是一种特殊的唯一索引,用于唯一标识表中的每一行记录。创建联合索引,将多个字段作为一个联合索引,索引中存在这些数据,查询就不会再次检索主键索引,从而避免回表。特点:减少索引占用的存储空间,同时在一定程度上保持索引的查询效率,较小的索引可以更快地加载到内存中。辅助索引是一种非主键索引,它提供主键之外的快速查询路径,但需要结合主键索引才能定位到完整数据行。

2025-05-27 20:05:54 297

原创 MySQL问题:B-Tree与B+Tree的区别?

B+树通过数据全存叶子节点+链表连接的设计,牺牲单点查询的极致速度,换取了范围查询、磁盘IO和稳定性的全面优势,因此成为数据库索引的标准选择。范围查询效率:低(需要中序遍历) | 高(链表直接遍历相邻叶子节点)叶子节点链接:叶子节点间无指针连接 | 叶子节点通过双向链表串联。查询稳定性:非叶子节点命中即可返回 | 必须到叶子节点,稳定。数据存储位置:所有节点均可存数据 | 仅叶子节点存数据。使用B+Tree作为MySQL索引结构的原因。

2025-05-26 14:44:36 134

原创 MySQL问题:数据库有哪些存储引擎,它们有什么区别?

行锁之所以能提供更高的并发性能,是因为它允许多个事务同时操作同一张表中的不同行数据。原因:支持事务、行锁、崩溃恢复(Redo Log重放前滚、Undo Log 回滚)InnoDB 它支持事务、外键、锁粒度为行锁,索引类型B+Tree。MyISAM它不支持事务、外键,锁粒度为表锁,索引类型B+Tree。Memory它不支持事务、外键,锁粒度为表锁,索引类型B-Tree。InnoDB:高并发事务、OLTP系统,涉及金钱、交易和并发写。原因:内存存储,读写极快,但重启数据丢失。原因:表锁导致写性能差,读速度快。

2025-05-26 14:27:14 307

原创 单调栈简单习题分析

每次都要将要加入栈中的元素与栈顶元素进行比较判断,符合条件(递增或递减)就保留存入栈中,但不符合就是要进行实现题目的要求,进行相应的操作后,弹出栈顶元素,但这还没完,要继续与新的栈顶元素进行比较判断,如果符合了就将这个元素加入栈中,成为新的栈顶元素。其实就是一个普通栈,但这个栈有一个特性,栈中的元素有一个特点就是单调,要不是单调递增要不就是单调递减(两者都包含相等元素情况)。天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用。,表示每天的温度,返回一个数组。

2025-05-14 20:58:42 349

原创 分割等和子集习题分析

给你一个的数组nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

2025-05-14 14:51:06 171

原创 习题 整数拆分

给定一个正整数n,将其拆分为k个的和(k >= 2),并使这些整数的乘积最大化。返回你可以获得的最大乘积。

2025-05-12 17:45:52 188

原创 删除链表倒数第N个节点

首要目标就是找到第N个节点的前一个节点,因为只有通过这个节点(cur)才可进行对第N个节点进行删除操作,即cur->next=cur->next->next;但是要是找到第N个节点不是很容易,可以使用便捷方法——快慢指针,使用时要考虑一点如何找到第N个节点的前一个节点,即将N+1,这样就可实现。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。

2025-05-08 19:54:50 487

原创 合并区间习题分析

要得到一个不重叠的区间数组,就是进行比较。为了方便比较,先进行数组的排序,使用sort得到一个以第一元素从大到小的顺序排好的数组。以第一个二维数组元素的end与第二个二维数组元素的start进行比较,如果大于等于就进行二次比较,小于就进行收集结果:第二次比较的是第一个二维数组元素的end与第二个二维数组元素的end,谁大将存入的最后一个元素的end更换。一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回。

2024-12-09 18:56:19 428

原创 非递减子序列习题分析

对于去重操作是此题的重点。对于求递增子序列,原数组的元素顺序就不能改变,这就不能使用sort进行遍历数组来进行比较去重,所以我们可以介入set或map来进行去重操作。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。在使用set或map去重时要注意不可直接作为类成员,要放在每次回溯中。此题要在数组中找出所有的不同递增子序列,我们可以使用回溯进行求解。,找出并返回所有该数组中不同的递增子序列,递增子序列中。

2024-12-08 20:21:33 648

原创 组合总和习题分析

使用的方法是回溯,还是遍历整体得到答案,但此题不同,题目中说可以有重复的元素,此时就要考虑回溯函数中的参数如何写。可能大家也想到能不能通过创建used数组,来记录元素使用情况,如果在不满足target的情况下,让原元素仍可继续使用。此题的巧妙之处就是在回溯函数中的参数如何满足题目条件。就是在定义的index在传递时传的是当前的遍历的值,即就是index=i传i的值。就是本题的关键,其余代码根据回溯三步曲和回溯模板就可以写出。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为。

2024-12-06 20:41:22 561

原创 电话号码的字母组合习题分析

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。还是使用回溯进行求解,遍历全部的结果。的字符串,返回所有它能表示的字母组合。1.返回值类型和参数。

2024-12-06 19:18:09 470

原创 螺旋矩阵习题分析

本题就是要将矩阵中的数字按照顺序输出,我们可以进行设置边界。up、down、left、right,通过边界的控制进行指定的输出。,返回矩阵中的所有元素。

2024-12-05 21:15:12 347

原创 反转链表2习题分析

left点的节点是cut,其前一个节点是pre,而后一个节点是next。每次只反转一个节点,直到right点。即cut的next要连接next的next,next的next更改连接为pre的next也就是此时的cut。可能有小伙伴会将next-next=pre->next写成next-next=cut,这样是会出错,是因为代码本意要将next节点的next指针指向pre节点的下一个节点,而使用next->next=cut会导致真正的next->next节点被孤立,不再是链表的一部分,打破链表的连续性。

2024-12-05 20:40:10 523

原创 二叉树的最近公共祖先习题分析

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。要想判断当前节点是否是要找到的祖先节点,一定要先确定其左右孩子是不是要找到p和q,这符合左右中的顺序,所以选择后序遍历。回溯便是将后序遍历判断好的结果向上返回。对于此题会发现找到的祖先需要向上返回以输出结果,但如何返回呢?可以通过后序遍历和回溯将结果返回。给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

2024-12-02 19:16:17 281

原创 全排列习题分析

回溯的本质还是暴力求解,通过设置used数组进行标记使用过的数,从头遍历到尾找到满足题目的答案。对于排列问题,就是典型的回溯问题。给定一个不含重复数字的数组。1.回溯函数返回值和参数。使用回溯算法进行求解。

2024-12-01 17:46:17 895

原创 岛屿数量习题分析

使用方法为DFS,将遇到的“岛屿”更改为0,表示已探索。以二维数组作为坐标系,设置行列,进行探索。因为岛屿为1,水为0,可以将遍历时遇到的岛屿转化为0,再让其上下左右四个方向进行搜索,遇到1就转变为0。当四个方向的搜索结果都是0时,再进行下一个坐标的遍历。依次将每个点都遍历一遍。给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。

2024-11-29 19:27:39 852

原创 搜索旋转排序数组习题分析

此时就可使用左闭右闭的形式,进行查找即循环条件写为:left<=right,意味着二分查找的搜索空间已经缩小到了一个元素。二分查找的过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或小于中间元素,则搜索过程将在数组的大于或小于中间元素的那一半区域中继续,以此类推,直到找到要查找的元素,或者剩下的半区域为空。在查找旋转点时,则使用左闭右开,因为无法确定mid是否是旋转点,所以要将mid的值保留到下次循环查找即right=mid。,则返回它的下标,否则返回。

2024-11-28 21:34:19 533

原创 二叉树的层序遍历习题分析

首先将根节点放入队列中,添加根节点后,进行循环。然后记录队列的大小,这步很关键,这影响到后面弹出元素的个数进而满足层序遍历的需求,相当于做了一个快照。定义一个数组用来存储当前层的元素,但最后要输出的是二维数组,大家不要忘记。使用for循环,循环次数就是记录的当前队列的大小,这个值记录的就是本层里边的元素数量。将队列的第一个元素取出并记录下来,进行删除后再将第一个元素的值添加到数组。题意就是要将二叉树中的元素一层一层输出,此题如果只根据二叉树的特点进行求解的话很难实现,所以我们可以使用队列进行辅助。

2024-11-27 21:31:13 491

原创 最长回文字串习题分析

可以先创建一个回文判断函数(isPalindrome),对于一个回文字串将第一个元素和最后一个元素删去后剩余的字串仍是回文字串。使用双重循环进行遍历,找到一个字串后就进行判断,是否是回文字串并且其长度是否大于前一个回文字符串,最后输出最长的回文字串。中最长的 回文子串。

2024-11-26 21:26:02 490

原创 三数之和习题分析

先使用sort将数组元素按从小到大的顺序排好,然后进行循环,设置left和right双指针,进行判断,当三数之和小于0,要进行left++;三数之和等于0的话还要判断,要进行去重,当left与后一个left指向的元素相等left++,要是right与前一个right指向的元素相等right--。给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。

2024-11-24 17:14:22 533

原创 最大子数组和习题分析

就像5+(-5)>(-5)但0<5,这不需考虑即使比加数前的和小,因为加上当前下标元素是为了进行求接下来的数组和是多少。(如果仍保留相加前的数组和,这就代表子数组到此停止,因为子数组是连续的部分)。要计算出最大的子数组和,可以将第一个元素作为开始的数组和,进入循环开始进行判断,如果数组和加上当前下标元素大于当前下标元素(cur + nums[i] > nums[i]),就要将数组和赋值为二者的和。但如果数组和加上当前下标元素小于当前下标元素,就要将当前下标元素赋值作为数组和(cur = nums[i];

2024-11-24 16:35:06 480

原创 无重复字符的最长子串习题分析

当有相同的字符出现时,set.insert()停止插入字符,通过left开始向前遍历,而循环依次按照set.earse()进行删除直到set中不在存放着与right指向相同的字符。因没有与right指向字符相同的,所以跳出循环,再将right指针指向的字符加入set,然后以此类推。直到right走到末尾。滑动窗口是一种抽象的概念,它表示一个在数组/字符串中滑动的窗口。通过set进行存放插入的元素,通过right进行向右遍历,因为set机制,当set.count()中是已经包含的数则输出1,不包含就输出0。

2024-11-21 20:23:35 619

原创 只出现一次的数字习题分析

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。可能大家一开始就使用哈希表进行解答,通过将整个数组遍历计数,当时此题要求只使用常量额外空间,所以哈希表不能使用。[4,1,2,1,2] 进行异或运算-> 4^1^2^1^2=4^1^1^2^2=4。任何数与自身异或的结果是0 5^5=0 6^6=0。任何数与0异或的结果是它本身 5^0=5 6^0=6。异或运算满足结合律 (a^b)^c=a^(b^c)异或运算满足交换律 a^b=b^a。

2024-11-20 19:40:33 408

原创 移动零习题分析

因为条件要求不可复制数组,所以不能新建一个数组来接收nums中的元素。而对于push_back也是不可使用的,因为这样会导致数组的大小增加,违背题目条件要求。给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。

2024-11-18 15:05:58 377

原创 哈希表学习分享

/1.介绍哈希表//unordered_map是不按照键值排序的 (使用头文件unordered_map)/*unordered_map<int, int>其中的第一个int代表的是键,第二个int代表的是值所以称为键值对,以一对一对的形式出现*///[]即可以修改,也可插入map[1] = 1;//向哈希表中插入键值对 1:1map[2] = 2;//修改//因为是int类型的“值”,默认值为0,向哈希表中插入元素 3:0map[4]++;

2024-11-17 20:36:05 588

原创 多数元素习题分析

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。对于此题可以使用哈希表来求解,通过遍历一遍数组,将其中的数组元素作为哈希表中的键值,然后统计次数。如果次数超过了数组大小的一半,则输出结果。

2024-11-17 20:28:04 477

原创 回文链表习题分析

对于此题,因为节点个数是未知的,要是求的话也不方便,所以我们可以通过快慢指针来找到中间节点,以中间节点为分界,将右侧的链表反转,最后与左面的链表来进行比较,得到答案。可能有小伙伴会问,是否可以将链表整体反转,然后与原链表进行比较得到答案。使用这种思路解题要考虑是否会破坏原始链表的结构,如何保持来链表的原样。判断是否是回文链表,就是第一个节点的值和最后一个节点的值是否相等,第二个节点的值是否和倒数第二个节点的值相等,依次类推。给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。

2024-11-16 17:28:11 449

原创 反转链表方法分享

递归方法在代码上看起来更简洁,但迭代方法通常在空间效率上更优,因为递归可能导致堆栈溢出,特别是对于非常长的链表,所以大家在使用时要考虑一下两者哪种更合适。

2024-11-16 17:09:47 568

原创 路经总和习题分析

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum。叶子节点 是指没有子节点的节点。题意是从根节点出发,从左右孩子中找到一条节点和等于targetSum的路经,有的话就返回true,没有就返回false。其中还需要保证这条路径是从根节点到叶子节点的。在遍历时要注意回溯,当减去节点值进行判断是否满足结论后,记得恢复减去的值。此题不需要根节点的处理逻辑,即使用前中后遍历顺序都可以。

2024-11-15 18:22:25 514

原创 最长公共前缀习题分析

因为是寻找公共前缀,并不只是找最长的前缀,所以数组中的其他元素只需与第一次元素相比就可得到最大公共前缀。编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。

2024-11-14 20:10:27 336

空空如也

空空如也

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

TA关注的人

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