自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 set 与 map底层实现

迭代器的好处是可以方便遍历,是数据结构的底层实现与用户透明。begin()与end()STL明确规定,begin()与end()代表的是一段前闭后开的区间,而对红黑树进行中序遍历后,可以得到一个有序的序列,因此:begin()可以放在红黑树中最小节点(即最左侧节点)的位置,end()放在最大节点(最右侧节点)的下一个位置,关键是最大节点的下一个位置在哪块?能否给成nullptr呢?

2024-07-24 11:32:05 201

原创 红黑树(C++实现)

◉ 如果u节点存在,则其一定是黑色的,那么cur节点原来的颜色一定是黑色的,现在看到红色的原因是因为cur的子树在调整的过程中将cur节点的颜色由黑色改成红色。◉ 如果u节点不存在,则cur一定是新插入节点,因为如果cur不是新插入节点,则cur和p一定有一个节点的颜色是黑色,就不满足性质4:每条路径黑色节点个数相同。p为g的左孩子,cur为p的右孩子,则对p先进行左单旋,回到情况二 再对g进行右单旋。p为g的右孩子,cur为p的左孩子,则对p先进行右单旋,回到情况二 再对g进行左单旋。

2024-07-22 17:11:23 940

原创 AVL树(C++实现)

int _bf;

2024-07-21 14:35:53 788

原创 C++中map和set

kw=set翻译:❍ set是按照一定次序存储元素的容器❍ 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。❍ 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。❍ set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。

2024-07-19 15:25:55 703

原创 C++中二叉树进阶

那能否进行改进,不论按照什么次序插入关键码,二叉搜索树的性能都能达到最优?对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。,通过英文可以快速找到与其对应的中文,英文单词与其对应的中文<word, chinese>就构成一种键值对;1️⃣ 从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。❍ 在二叉搜索树中检索该单词是否存在,存在则拼写正确,不存在则拼写错误。,统计成功后,给定单词就可快速找到其出现的次数,

2024-07-18 20:52:40 768

原创 Linux权限的概念

● 目录的可执行权限是表示你可否在目录下执行命令● 如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)● 而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限● 所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。

2024-07-16 09:37:09 956

原创 第一节Linux常见指令

tail命令从指定点开始将文件写到标准输出,使用tail命令的 -f 选项可以方便的查阅正在改变的日志文件,tail -f filename 会把 filename 里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容。说明:cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中,若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息。公历是选择国际通用的历法,又称格列历,通称阳历。

2024-07-15 10:12:43 1311

原创 C++中的多态

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。**在继承中构成多态的两个条件:**★ 虚函数重写★ 父类指针或者引用调用虚函数多态调用,看指向对象类型,指向谁调用谁的虚函数普通调用,看调用者的类型,调用调用者的函数在C++中,抽象类是一种特殊的类,它不能被实例化,其主要目的是为了继承。抽象类至少包含一个纯虚函数,纯虚函数是在声明中初始化为0的虚函数(即在虚函数后面写上 = 0)。

2024-07-10 12:58:42 860

原创 C++中的继承

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。// 这里体现出了Student和Teacher复用了Person的成员。

2024-07-09 13:18:00 821 1

原创 滑动窗口练习5-水果成篮(字节跳动)

一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。输入:fruits = [3,3,3,1,2,1,1,2,3,3,4]如果从第一棵树开始采摘,则只能采摘 [0,1] 这两棵树。如果从第一棵树开始采摘,则只能采摘 [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-07-08 10:40:38 390

原创 编译和链接+预处理详解

C语言设置了一些预定义符号,可以直接使用,预定义符号也是在预处理期间处理的。__FILE__ //进⾏编译的源⽂件__LINE__ //⽂件当前的⾏号__DATE__ //⽂件被编译的⽇期__TIME__ //⽂件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义(VS2022不遵循)举个例子。

2024-07-07 16:55:35 566

原创 滑动窗口练习4-将x减到0的最小操作数

题目要求的是数组「左端 + 右端」两段连续的,和为 x 的最短数组,信息量稍微多一些,不易理清思路;解释:最佳解决方案是移除后三个元素和前两个元素(总共 5 次操作),将 x 减到 0。输入:nums = [3,2,20,1,1,3], x = 10。输入:nums = [1,1,4,2,3], x = 5。解释:最佳解决方案是移除后两个元素,将 x 减到 0。输入:nums = [5,6,7,8,9], x = 4。此时,就是熟悉的「滑动窗口」问题了。数组以供接下来的操作使用。

2024-07-06 11:35:25 301

原创 滑动窗口练习3-最大连续1的个数(三)

初始化一些变量 left = 0,right = 0,ret = 0;输入:nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3。不要去想怎么翻转,不要把问题想的很复杂,这道题的结果无非就是一段连续的 1 中间塞了 k 个 0 嘛。解释:[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2。解释:[1,1,1,0,0,1,1,1,1,1,1]

2024-07-05 14:34:03 339

原创 Pandas

理解Pandas数据结构Series和DataFrame。常用操作:读取、查看、选择、过滤、添加、删除、处理和导出数据。实际操作:通过实际示例代码练习上述操作。

2024-06-22 10:14:53 329

原创 数据采集与预处理复习资料

大数据(big data)是指那些无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合。这些数据集合具有海量的数据规模、快速的数据流转、多样的数据类型和价值密度低的特征,需要新的处理模式才能具有更强的决策力、洞察发现力和流程优化能力。简而言之,大数据是一种海量的、高增长率和多样化的信息资产。大数据的五大特征通常包括:大量、高速、多样、低价值密度和真实性。这些特征使得大数据在各行各业中具有广泛的应用前景,包括但不限于商业分析、医疗研究、政府决策等。

2024-06-21 16:28:44 1553

原创 爬虫 pandas Linux Flume Pig填空题

在POST请求中,传统表单数据通过。

2024-06-21 16:07:30 866

原创 滑动窗口练习2-无重复字符的最长字串

再往后寻找无重复字串能到达的位置时,可以利用「哈希表」统计出字符出现的频次,并判断什么时候字串出现了重复元素。如果这个字符出现的频次超过 1 ,说明窗口内有重复元素,那么就从左侧开始划出窗口,请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。由英文字母、数字、符号和空格组成。

2024-06-21 09:52:06 269

原创 滑动窗口练习1-长度最小的子数组

但是如果继续像方法一一样,重新开始统计第二个元素( left2 )往后的和,势必会有大量重复的计算(因为我们在求第一段区间的时候,已经算出很多元素的和了,这些和是可以在计算下次区间和的时候用上的)。这个窗口寻找的是:以当前窗口最左侧元素(记为 left1 )为基准,符合条件的状况,也就是在这道题中,从 left1 开始,满足区间和 sum >=target 时的最右侧(记为 right1 )能到哪里。输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0。

2024-06-19 10:05:43 877

原创 双指针练习:四数之和

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target。请你找出并返回满足下述全部条件且。2.在这个数 a 的后面区间上,利用「三数之和」找到三个数,使这三个数的和等于 target - a 即可。输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]输入:nums = [1,0,-1,0,-2,2], target = 0。输入:nums = [2,2,2,2,2], target = 8。输出:[[2,2,2,2]]1.一次固定一个数a;

2024-06-17 16:02:27 248

原创 双指针练习:三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。那么三数之和就是固定一个数,找到两个数相加等于固定这个数的相反数,于是三数之和🟰0;不同的三元组是 [-1,0,1] 和 [-1,-1,2]。输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]输入:nums = [0,0,0]输出:[[0,0,0]]

2024-06-14 07:59:40 560

原创 双指针练习:和为s的两个数字

购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。输入:price = [3, 9, 12, 15], target = 18输出:[3,15] 或者 [15,3]输入:price = [8, 21, 27, 34, 52, 66], target = 61输出:[27,34] 或者 [34,27]两层for循环:·外层 for 循环依次枚举第一个数a;·内层 for 循环依次枚举第二个数b,让它与a匹配。

2024-06-13 10:43:57 417

原创 双指针练习:有效三角形的个数

根据「解法一」中的优化思想,我们可以固定一个「最长边」,然后在比这条边小的有序数组中找出一个二元组,使这个二元组之和大于这个最长边。2 + 9 > 10(最小的➕次大的数大于最大的数,那么left 与 right之间所有的数与9相加都大于10,也就是有right - left边都满足,此时可以right--)此时,边长为10最大的边情况已经遍历完毕,接下来max--,继续以同样的方式,遍历出每个符合构成三角形的边,累加即可解出此题。三层 for 循环枚举出所有的三元组,并且判断是否能构成三角形。

2024-06-13 10:42:37 544

原创 C++模板进阶

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。【优点】1.模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2.增强了代码的灵活性【缺陷】1.模板会导致代码膨胀问题,也会导致编译时间变长2.出现模板编译错误时,错误信息非常凌乱,不易定位错误。

2024-06-07 14:48:38 730

原创 STL中stack和queue模拟实现+容器适配器

deque(双端队列):是一种双开口的“连续”空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素,与list比较,空间利用率比较高。deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组双端队列底层是一段假象的连续的空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在看deque的迭代器身上,因此deque的迭代器设计就比较复杂,如下图所示;

2024-06-06 15:10:46 882

原创 priority_queue的模拟实现

目录priority_queue类定义priority_queue构造函数priority_queue类push()函数priority_queue类pop()函数priority_queue类size()函数priority_queue类empty()函数priority_queue类top()函数仿函数与priority_queue类模拟实现项目代码:实现priority_queue的方式和stack和queue基本类似,因为priority_queue也是一种容器适配器,但是只能使用vector和de

2024-06-06 15:07:18 467

原创 STL中vector动态二维数组理解(杨辉三角)

因此我们可以初始化二维数组每个数为0,将每行第一列和最后一列数字置为1,将其余不是1的数字进行上一行当前位置 + 上一行当前-1位置相加。本题的主要目的是理解vector<vector<int>>,以及会访问vector<vector<int>>元素。vector<vector<int>>实质是一个vector 里面的类型是vector<int>2️⃣除了每行第一列和最后一列,其余位置 = 上一行当前位置 + 上一行当前-1位置之和。在「杨辉三角」中,每个数是它左上方和右上方的数的和。

2024-06-02 21:03:17 346

原创 STL中queue的介绍和使用

1.队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。2.队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。3.底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。4.标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。

2024-06-02 11:21:49 939

原创 双指针练习:盛水最多的容器

由此可看无论怎么移动 v 都会变小,这里可以总结一个规律:如果移动之后的数,小于left与right原先所对应的值,那么这个新的v,一定比原来小。当我们不断重复上述过程,每次都可以舍去大量不必要的枚举过程,直到left 与 right相遇,期间产生的所有容积里面的最大值,就是最终答案。我们假设左边界最小,那么此时移动left,遇到的数比left大,就会改变高度最小值(2->5),这样v就有可能增大。如果移动之后的数比原来的大,那么高度是不变的,width是变小的,因此v变小。返回容器可以储存的最大水量。

2024-06-02 10:01:19 1013

原创 STL中stack的使用

1.stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2.stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出3.stack的底层容器可以是任何标准的容器类模版或者一些其他特定的容器类,这些容器类应该支持一下操作:·empty:判空操作·back:获取尾部元素操作·push_back:尾部插入元素操作。

2024-06-01 11:17:15 368

原创 双指针练习:快乐数

由此可以推出:一个数经过不停的分割成下一个数,经过811次 这个分割后的数一定会出现重复的情况,也就是会进环,因此我们使快慢指针追击即可。我们来计算这个数每个位置上的数字的平方和,9^2 * 10 = 810,也就是最大的数是810。题目n最小为1,所以每个位置上的数字平方和的范围在 [1,810] 之间,有810个数。n个巢,有n+1个鸽子,可以推出至少有一个巢,里面的鸽子数大于1;由此我们可以发现:如果数n 是一个快乐数,它的最后一个数是1。如果数n 不是快乐数,它最终会形成一个环,不停的循环下去。

2024-06-01 10:00:45 599

原创 双指针练习:复写0

(越界的原因是因为cur 位置为0,des+=2 ,越界了一位,修改了一位数组以外的数据为0,即非法访问,因此,此时我们只需要修改一个dest为0就可以了,因此先手动修改arr[n-1] = 0 ,此时cur当前指的0也就我们手动修改过了,因此cur--,dest-=2)给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。·如果是0,dest以及dest -1位置修改成0,dest-=2;·如果非0,dest位置的数据 = cur位置的数据,dest--;

2024-05-31 13:06:46 569

原创 优选算法一:双指针算法与练习(移动0)

3.cur指针开始向后移动,为了实现【des+1 ,cur-1】中间是0,那么控制cur的条件就是,cur遇到0就跳过,也就是继续往前走。如果遇到了不是0,那么就将des+1,进行交换,交换后cur当前位置就变成了0,继续加加,直到遍历完数组。根据cur在扫描的过程中,遇到不同的情况,分类处理,实现数组的划分。2.既然cur指针在首元素,为了实现数组被划分三个阶段,那么des只能在cur之前的位置也就是 -1 处。·在一次循环中,每次让慢的指针向移动一位,而快的指针往后移动两位,实现一快一慢。

2024-05-30 20:08:49 742

原创 STL中list的模拟实现

代码是没有问题的,但是我们也可以发现,这样非常的冗余 有些函数是没有变化的,确多写了一遍,有没有什么办法能解决这种冗余呢?const迭代器的目标是 迭代器本身可以修改,指定的内容不能修改,类似const T* p。因此我们重新写一个const类进行封装,我们只需改变解引用即可,使得指向内容不能修改。浅拷贝生成的ls2,与ls1的地址相同,对ls1操作也会对ls2有影响。由于我们经常使用申请头节点,因此我们把头节点封装成一个函数,便于调用。这里存在迭代器失效,因此我们和库里一样返回下一个节点迭代器。

2024-05-30 14:48:05 756

原创 List基本使用(C++)

1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3.list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4.与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移动元素的执行效率更好。

2024-05-27 20:27:39 803

原创 vector类实现

vector类的迭代器区间不局限于本类的迭代器,所以需要用到函数模版。C++内置类型也支持构造,C语言不行。例如初始化int可以这样写。

2024-05-22 21:14:47 338

原创 vector的介绍及使用

1.vector是表示可变大小数组的序列容器。2.就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3.本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。

2024-05-19 10:32:52 657

原创 string类实现

因为C形式字符串是内置类型,所以使用cout打印时编译器会自动识别类型,相当于使用%s进行打印字符串,只需要返回字符串数组首字符地址即可。可以以数组的形式,通过下标访问数据。我们采用声明和定义分离的方式。

2024-05-15 20:03:07 451

原创 C语言文件操作-全

磁盘上的文件是文件。程序文件、数据文件(从文件功能的角度来分类的)。上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)

2024-05-12 15:29:27 883 1

原创 Linux常见指令2️⃣

tail命令从指定点开始将文件写到标准输出,使用tail命令的 -f 选项可以方便的查阅正在改变的日志文件,tail -f filename 会把 filename 里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容。说明:cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中,若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息。减少网络传输的数据量。为什么要打包和压缩?

2024-05-11 10:40:22 403 1

原创 String2⃣️-string类对象的修改操作

从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置。在str中从pos位置开始,截取n个字符,然后将其返回。operator+=:在字符串后追加字符串str。push back:在字符串后尾插字符c。append:在字符串后追加一个字符串。返回char格式字符串。

2024-04-30 14:51:35 256

空空如也

空空如也

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

TA关注的人

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