自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 2024-5-3学习笔记 虚拟继承原理

1. 很多人说C++语法复杂,其实多继承就是一个体现。

2024-05-03 12:13:01 512

原创 2024-5-3学习笔记 继承关系拓展

友元类不能继承,也就是说基类友元不能访问子类私有和保护成员。简单的理解就是,爸爸的朋友不是儿子的朋友。

2024-05-03 10:00:00 381

原创 2024/5/3学习笔记:派生类的默认成员函数

构造函数的规则一般都于析构函数相反,.派生类对象初始化先调用基类构造再调派生类构造, 派生类对象析构清理先调用派生类析构再调基类的析构。

2024-05-03 09:30:00 293

原创 2024/5/2 学习笔记:继承基本概念

继承关系根据父类里各个限定符域以及规定好的继承方式来决定派生类能调用父类里的哪些成员变量。

2024-05-02 15:24:16 713

原创 2024/4/19学习笔记 vector模拟实现(2)

1.迭代器区间构造和size_t n 构造2.string扩容问题3.erase的缺陷。

2024-04-21 17:30:41 398

原创 学习笔记(4月18日)vector底层模拟实现(1)

vector底层部分功能模拟实现

2024-04-18 21:33:13 375

原创 学习笔记(4月17日)vector底层原理

作者本人的学习笔记,方便复习用

2024-04-17 20:56:12 517

原创 C语言每日一题(68)无重复字符的最长字串

这也是一道经典的滑动窗口题,事实上滑动窗口模板是非常固定的,无非就是进窗口出窗口,然后判断条件,更新结果,每一道题的不同点都是在这四个方面。1.首先如何判断我们取得的字串内有重复字符,利用哈希表,将每一个进窗口的字符进入哈希表,每当新字符进入时就判断一下哈希表上对应的值是否存在。2.如果存在的话,此时就要出窗口,将left不断右移,每右移一个,就将对应字符的哈希表减1,直到重复字符的哈希表值为1即可。因为无重复字符的最长子字符串是。因为无重复字符的最长子字符串是。,所以其长度为 1。,所以其长度为 3。

2024-04-13 22:08:12 341

原创 C语言每日一题(67)长度最小的子数组

3.题目给的是正整数数组,说明当我们第一次满足条件后,后面的数再进窗口的话也肯定是满足的,所以没满足一次条件时,我们都要将数据出窗口(left++),如果出完数据后还满足条件就更新一下最短长度,然后再判断。2.right往下遍历,从0开始,每往下一个位置就累加,直到和大于等于target时,我们统计一下该窗口的长度。1.最开始的窗口单位大小只有一个,用两个指针left和right来规范窗口的大小,最开始都指向0位置。如果不存在符合条件的子数组,返回。是该条件下的长度最小的子数组。

2024-04-10 22:20:54 418

原创 C语言每日一题(66)三数之和

4.为了避免出现重复结果,我们之前已经对数组进行了排序,假设此时left和right指向的值的和满足条件,又因为排序后连续的数会放到一起,所以left后面和right前面就会存在重复元素,此时我们需要跳过它,同时也要避免left>right,因为前面匹配后lefti已经移动了一次,如果用left后面的值当作判断的话,可能left的下一个元素是新元素,而此时left还在重复元素上,所以要有left前面的值进行判断,right也是一样,反过来就行。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。

2024-04-09 21:37:36 860

原创 C语言每日一题(65)有效三角形的个数

当nums[left]+nums[right]>nums[max]时,说明这两个数是符合条件的,并且不止一组,这是已经排过序的数组,如果nums[left]+nums[right]>nums[max],说明left+1到right都是满足的,而且个数就是right-left,只需比较一次就能找出许多情况,非常高效。如果nums[left]+nums[right]<=nums[max],说明此时left可以进行下移,因为此时right最大条件都不满足,那移动right指针没有意义,此时应该移动的是left。

2024-03-26 20:50:01 599

原创 C语言每日一题(64)快乐数

这道题数据的取值范围是2的31次方-1,转换一下等于2147483647,我们取到数字个数的最大值,即9999999999,可以推导出,这个数通过题目的方法取到的数,一定是最大的(因为原数比范围还大,同时也是各位上的最大值),即81*10=810,所以,测试样例的变化范围就在【1,810】之间,不会有大于它的数存在。没什么好说的,很简单;设需要检测的数为x,假设最坏情况,它变化了810次都没有重复的数存在,说明它已经将1——810的数已经遍历完一遍,当进行第811次时,必定有重复值出现。

2024-03-18 19:19:16 1186

原创 数据结构入门(3)顺序表和链表

链表和顺序表详解

2024-03-12 21:46:28 825

原创 C语言每日一题(63)复写零

1.当arr【cur】等于0时,将dest指针移动到cur位置,然后cur加一,从cur位置开始到整个数组结束,元素整体向右移动,最后在cur位置加个0即可。按照题目要求直接实现,定义两个指针cur和dest,两个指针从零开始,cur用来扫描整个数组。调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4],请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。2.当arr【cur】不等于0时,cur往下走,dest不动。调用函数后,输入的数组将被修改为:[1,2,3]

2024-03-12 20:13:18 499

原创 数据结构入门(3)2.链表接口实现

本文将介绍链表常见的功能的实现。

2024-03-11 21:12:25 1113 1

原创 C语言每日一题(62)移动零

定义两个指针cur和prev,从最左边开始,如果nums【cur】==0的话,cur往下走,此时定义一个计数器记录0的个数,当nums【cur】不为0时,就将该值赋给prev的位置,之后prev往下走,cur也往下走,直到cur越界,此时prev指向的位置就是需要赋值0的位置。同样定义两个指针prev和cur,当cur的值等于0时,cur就往下走,直到cur不等于0时,此时它与prev的间隔数就是0的个数,将cur的值于prev的值交换,然后prev往下走,直到cur越界完成。空间复杂度:O(1)

2024-03-05 23:32:50 324

原创 C语言每日一题(61)盛最多水的容器

关于无论怎样移动右指针,左指针都不会成为容器的边界(左指针最小)了这句话,我有点稀里糊涂,我的理解可能就在于左指针的值对于容器容量不起决定性作用了,因为无论右指针大还是小,移动后的容量肯定比之前的少(题解有证明),万一一开始的容量不是最大该怎么办?定义左右两个指针分别向数组中间走,可以看出,容器的容量就是两个指针指向的值中最小的那个值乘以两个指针之间的距离,可以用木桶效应来解释,即桶的容量取决于最短的那块木板。第一次结果出来后,值较小的指针往中间走,这期间更新最大值,直到俩指针相遇。

2024-02-23 21:36:40 1905 4

原创 C语言每日一题(60)对链表进行插入排序

链表的插入操作:将lastsorted指针的next指向cur的next,cur的next指向prev的next,也就是lastsorted,随后prev的next指向cur即可。1.lastsorted:指向待插入链表的最后一个位置的指针(插入排序将插入位置前面的部分看成是已经有序的),最开始指向head。小于的话,prev指针从dummy开始遍历,找到需要插入的结点的前一个结点进行插入操作。3.prev:指向插入位置的前一个结点,插入时使用,最开始指向dummy(哨兵位)对链表进行排序,并返回。

2024-02-21 21:48:31 595

原创 C语言每日一题(59)左叶子之和

最后去往右子树找,右子树的递归条件和左子树不一样,因为右子树也会存在有左叶子结点的情况,所以如果右子树是一个叶子结点的话就没必要递归了,但如果不是的话,就得往右子树里找。其次去往左子树找,如果左子树存在且不为叶子结点的话,继续往它的左子树找,直到找到叶子结点为止,如果是叶子结点,直接返回它的值累加到一个变量里。题目要求找左叶子的和,那么前提是它一定是一个叶子结点,其次才判断它是否是左叶子。在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24。,返回所有左叶子之和。如果根结点为空,返回0;

2024-02-18 19:24:03 497

原创 C语言每日一题(58) 叶子相似的树

递归细节:如果左右孩子都为空,说明递归到叶子结点了,就将这个结点的值放入数组,如果不是,如果左孩子存在,就递归到左孩子,如果右孩子存在,就递归到右孩子。请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个。如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是。举个例子,如上图所示,给定一棵叶值序列为。如果给定的两个根结点分别为。的树是叶相似的,则返回。

2024-02-15 08:30:00 418

原创 数据结构入门(3)1:顺序表接口实现

本文将一一介绍顺序表基本功能的接口实现,帮助大家提高编程能力,加深对数据结构的理解本文将以动态顺序表为主进行解释。

2024-02-14 18:56:14 926 2

原创 Linux入门(1)Linux介绍

据权威部门统计,目前Linux在服务器领域已经占据75%的市场份额,同时,Linux在服务器市场的迅速崛 起,已经引起全球IT产业的高度关注,并以强劲的势头成为服务器操作系统领域中的中坚力量。随着Linux操作系统飞速发展,各种集成 在Linux上的开源软件和实用工具也得到了应用和普及,因此,Linux也成为了开源软件的代名词。据Linux基金会的研究,86%的企业已经使用Linux操作系统进行云 计算、大数据平台的构建,目前,Linux已开始取代Unix成为最受青睐的云计算、大数据平台操作系统。

2024-02-14 10:01:29 736

原创 C语言每日一题(57)二叉树的最小深度

当左孩子和右孩子同时为空时,返回1,说明碰到了叶子结点,如果其中一个结点不为空或者同时存在,先从左孩子开始递归,左孩子完到右孩子,直到找到叶子结点返回。首先理解,最小深度是从根节点到最近叶子节点的最短路径上的节点数量。接着实现大小的问题,我们分别将左右孩子递归的结果用一个变量保存,再找出最小的就可以了。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。给定一个二叉树,找出其最小深度。叶子节点是指没有子节点的节点。

2024-02-14 08:30:00 322

原创 C语言每日一题(56)平衡二叉树

找出左右子树的高度,如果高度差出现大于一的情况就返回false,从根节点开始,先从左子树找,再去右子树找。这里为了方便判断左右子树高度大小,利用了假设法,先假设左子树高度最高,后面再判断一下,如果不对就换一下。给定一个二叉树,判断它是否是高度平衡的二叉树。的左右两个子树的高度差的绝对值不超过 1。

2024-02-13 18:54:23 775

原创 C语言每日一题(55)另一颗树的子树

和相同二叉树是一个道理,但有一个情况:当根节点相同时,我们还得去比较所匹配子树的左右结点,而且会存在根节点不相同的情况,就需要去到左右结点去找,直到找到相同的。具有相同结构和节点值的子树。的某个节点和这个节点的所有后代节点。也可以看做它自身的一棵子树。

2024-02-12 08:30:00 277

原创 C语言每日一题(54)对称二叉树

和相同二叉树是一个道理,但判断相同的不是两颗子树对应的左右结点,而是将两颗子树的左右结点交错进行判断,即左孩子与右孩子判断,右孩子和左孩子判断。给你一个二叉树的根节点。, 检查它是否轴对称。

2024-02-11 08:30:00 221

原创 数据结构入门(2)时间复杂度与空间复杂度

关键的问题就是在于他执行的次数,而往往执行的次数就和循环非常大的关系,想要知道一个代码的时间复杂度时,找循环是最关键的。下面一串代码是关于如何实现斐波那契数列,代码非常简洁,其实编程是非常灵活的,一个功能可以有不同的实现方法,通常我们需要找到效率最高的,同时代码量非常可观,简洁的理想代码。在运行过程中,可以看到,除了函数定义的数组和常量以外,程序没有再申请其他空间,可以看作该程序申请了常数个额外空间,空间复杂度为O(1)。该程序动态申请了一个空间大小为n+1的数组,空间复杂度为O(N)。

2024-02-10 19:13:10 1166

原创 C语言每日一题(53)翻转二叉树

从叶子节点开始翻转,翻转时,保留左右孩子结点,进行交换。,翻转这棵二叉树,并返回其根节点。给你一棵二叉树的根节点。

2024-02-10 08:30:00 370

原创 C语言每日一题(52)单值二叉树

和相同二叉树是一个道理,也是判断两个结点情况,但这次是要从根结点开始判断,一旦值不相等就返回false。如果二叉树每个节点都具有相同的值,那么该二叉树就是。只有给定的树是单值二叉树时,才返回。

2024-02-09 08:30:00 313

原创 数据结构入门(1)数据结构介绍

本文将开始介绍计算机里的数据结构。数据结构是指数据对象中元素之间的关系,以及对这些关系的操作。数据结构可以分为线性结构和非线性结构。线性结构是指数据元素之间存在一对一的关系,例如数组、链表、栈和队列等。非线性结构是指数据元素之间存在一对多或多对多的关系,例如树和图等。数据结构的设计与实现是计算机科学中的一个重要研究领域,它关注如何组织和存储数据以便高效地访问和操作。选择合适的数据结构可以提高算法的效率,并优化程序的性能。常见的数据结构包括数组、链表、树、堆、图等。

2024-02-08 18:35:18 1283

原创 C语言每日一题(51)相同的树

还是基于递归的思想,但我们需要考虑一些特殊情况,递归过程中,如果碰到两个结点为空的情况,说明此时已经递归到两棵树的叶子结点了,而中途没有进行返回,说明两颗树相同。当两棵树有一个结点不相等的话,此时就要返回false了,除此之外,如果存在其中一个结点为空而另外一个结点不为空,也是要返回false的。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。,编写一个函数来检验这两棵树是否相同。给你两棵二叉树的根节点。

2024-02-08 08:30:00 302

原创 C语言每日一题(50)二叉树的最大深度

每一次递归,都要判断该节点的左右子树的最大值,直到递归到最下面的叶子节点,为空返回0,同时每一次返回时,记得加1,这是当前结点本身。基于递归的思想,从根结点开始,找出左右子树的最大值并返回,同时加上1(根节点本身)就是二叉树的最大深度。是指从根节点到最远叶子节点的最长路径上的节点数。

2024-02-07 20:58:39 417

原创 C语言每日一题(49)二叉树的三种基本遍历方法

链式二叉树、递归。

2024-01-30 21:59:09 220

原创 2024-1-26学习任务:堆实现算法和topK问题

堆是一种数据结构,这里提到的堆和内存里提到的堆不一样。堆的核心算法是向上调整算法和向下调整算法,通过这两种算法来解决堆排序问题和TopK问题,由于堆总是一棵完全二叉树,用数组来进行存储会非常方便,也有有益于接下来对于普通二叉树的理解。

2024-01-28 23:03:03 688

原创 C语言每日一题(48)回文链表

请你判断该链表是否为回文链表。给你一个单链表的头节点。

2024-01-25 23:03:59 656

原创 C语言每日一题(47)两数相加II

和两数相加比起来,这道题的难点在于它不是逆序的而是正序的,这意味着你不能直接在两个链表上进行操作,但可以逆转链表再进行操作,但这样工作量就会很大了,还容易出错。链表来代表两个非负整数。数字最高位位于链表开始位置。将这两数相加会返回一个新的链表。这里需要用到三个栈,一个存放链表1,一个放链表2,最后一个用来放和,和之前一样,进位的问题也得单独考虑进去。我做题做了很久,发现一般跟逆序有关系的基本上都可以用栈进行解决,毫无疑问,这里也可以。你可以假设除了数字 0 之外,这两个数字都不会以零开头。

2024-01-24 19:22:37 495 1

原创 2024-1-24学习任务:二叉树和堆

也是好久没有更新博客了,因为一直在准备期末考试,耽误了,现在开始将持续更新博客,让大家久等了。也是今天突然想起想以这个题目为主题,一方面是想记录一下每天的学习情况,方便复习,一方面也是想通过对自己所学习的内容进行解释,加深学习记忆,也希望对各位读者有帮助。每天的内容都会不同,是基于我自己的学习情况来写的,你们可能学过,但如果我的文章能让你们能有全新的理解的话,我也会很开心。

2024-01-24 14:46:51 1006 2

原创 关于学习计算机的心得与体会

学习计算机的路上的真实内心想法,给一些在这条路上迷茫的人一些建议。

2023-12-12 22:56:35 1420 3

原创 C语言每日一题(46)整数转罗马数字

拷贝细节:最开始的开辟的字符串长度为0,每次需要拷贝时,我们将字符串的首地址(数组名)加上它的长度,避免每次拷贝时会覆盖原来的字符串。我们寻找不超过 num 的最大符号值,将 num 减去该符号值,然后继续寻找不超过 num 的最大符号值,将该符号拼接在上一个找到的符号之后,循环直至 num为 0。我们将对应的字符和数字存入两个对应的数组value和symbols,遍历value数组,找到不超过num的最大值的下标,将下标对应的symbols里的字符拷贝到我们需要返回的开辟的字符串里即可。

2023-12-05 19:44:58 1229 2

原创 C语言每日一题(45)删除排序链表中的重复元素

有了44题的基础,这道题简直易如反掌。基于44题的思路,我们这次直接从头结点和它的下一个结点开始扫描,连哨兵位也不用定义。这题不同的点在于重复的元素至少要保留一个,所以扫描时如果下一个结点的值等于当前结点的值,我们就从下一个结点开始删,直到值不等时,继续遍历。删除所有重复的元素,使每个元素只出现一次。给定一个已排序的链表的头。

2023-12-04 18:43:20 612 1

基于C语言实现的三子棋小游戏

三子棋是一种基于棋盘的简单游戏,通常由两名玩家轮流下棋。每个玩家可以选择一个符号(通常是X和O),然后交替在棋盘上放置自己的符号。目标是通过将自己的符号连成一条线(水平、垂直或对角线),来先于对手获胜。 在基于C语言实现的三子棋小游戏中,我们可以通过以下方式实现: 1. 创建一个3x3的二维数组表示棋盘,每个元素可以是空、X或者O。 2. 设计一个函数来打印当前的棋盘状态,显示每个位置上的符号。 3. 实现一个函数来接受玩家的输入,包括行号和列号,然后根据输入来在棋盘上放置对应的符号。 4. 设计一个函数来检查当前是否有玩家获胜,即检查是否有连成一条线的情况。 5. 编写一个主函数,用于控制游戏的流程。在主函数中,通过循环交替调用玩家输入和检查获胜的函数,直到有一方获胜或者平局为止。 通过上述步骤,我们可以实现一个简单的三子棋小游戏。在游戏中,玩家可以在终端或者命令行中进行交互,通过输入行号和列号来下棋,并根据棋盘状态判断游戏结果。这个基于C语言的三子棋小游戏可以提供一个简单的游戏体验,同时帮助理解和练习数组、函数和流程控制等基本编程概念。

2024-02-14

基于C语言实现的顺序表以及基本接口实现

顺序表是一种线性存储结构,它采用一段连续的物理地址存储数据元素,具有元素随机存取、存储密度高、插入和删除操作效率低等特点。在顺序表中,数据元素按照一定的顺序存储,在程序中可以直接通过元素下标进行访问,因此具有高效的访问性能。作为一种基本的数据结构,顺序表在很多算法和应用程序中被广泛运用。 顺序表的基本实现包括表的定义、创建、插入、删除、查找以及遍历等操作。在定义顺序表时,需要指定顺序表的容量和元素类型。通常情况下,我们使用静态数组来表示顺序表,也可以使用指针动态分配内存来实现动态数组形式的顺序表。 顺序表的特点是支持随机访问,但在插入和删除操作时需要进行元素的移动,因此一些特殊场景下不适合使用顺序表。比如需要经常进行插入和删除操作的数据结构,就可以采用链表等其他形式的结构来存储数据。 在C语言中,我们可以使用数组和指针等基本数据结构和算法来实现顺序表的各种操作。通过运用C语言的数据类型和函数库,可以简单实现一个顺序表,并提供常用的接口操作,如插入、删除、查找等。

2024-02-14

空空如也

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

TA关注的人

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