- 博客(58)
- 收藏
- 关注
原创 C++基础算法:枚举
对于一些数据量较小的题目我们可以直接通过枚举出全部的结果,通过结果进行一一对比来判断结果是否正确叫做枚举法。对于上述这道题我们可以直接通过将所有的数据全部列举到4个数组中,后直接将数组从后向前进行遍历并且一一比较即可。将年份分离开来,通过枚举全部年份来确定回文数(这种时间复杂度较小于上面)直接枚举,然后通过条件进行辨别,这里的时间复杂度太高就不进行代码提供了。有年月后就可以判断这个月的天数,这里可以通过数组和函数实现。直接进行遍历,后直接比较(这种方式的时间复杂度是最大的)
2025-03-18 15:52:45
833
原创 C++基础算法:高精度
如果我们直接进行进位就会让这道题变得复杂,但是如果我们现将要加的数字先直接加到数组中,接着在按照加法的逻辑进行相加就会让这道题简单不少。为相加后的长度,先直接取为两数的最大值,后续再根据结果进行判断:如果最前面不为0就。这样我们可以直接进行比较,然后交换两者数据,一旦交换直接在前面输出一个。可以将进位直接放入到数组的前一位,直接相加后,进行进位和留余操作即可。找到相加的规律(c[i+j] += a[i]*b[j])最后判断最前方是否有数,如果有就将lc向前一位。和加法一样将字符串倒置方便后续计算。
2025-03-10 19:28:51
930
原创 C++基础算法:模拟
这道题是简单的模拟实现题目,主要将算式通过代码来实现出来,将所有的情况分析出来,代码进行实现即可。模拟,顾名思义,就是题目让你做什么你就做什么,考察的是将思路转化成代码的代码能力。本题是通过模拟运用数组来模拟实现蛇形方阵的题目,通过输入数据n来模拟实现要求。题目描述过多,可以先写主要逻辑,中间一些内容可以用函数代替。这样通过数组来模拟方向我们直接可以对其进行填数。总结这类题目要求分类详细,判断时要注意越界情况。将中间部分判断是数字还是字母的函数写出来。最后再将题目要求的写出来,其中。
2025-03-03 21:45:07
569
原创 C++初阶:模版的进阶使用
通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,需要特殊处理。函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇 怪的错误。非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常。类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。其原因仍然是因为对地址进行了排序,我们通过调试也可以发现此时的地址是按照升序进行排列的。这里可能错误的原因是:p1。
2024-12-16 18:58:48
804
原创 算法基础Day7(动态规划)
本质就是:保证填表不越界,根据状态转移方程进行填表。但是要注意这里没进行一次相加就要对相加的数进行取模。可以发现后面的数和前面的数是为前三个数字之和。为了填写当前状态,所需状态已经计算过了。所以就可以直接用动态规划进行解决这道题。状态表示值得是dp表里的值的含义。就是填报的这部分的代码要修改。动态规划的空间优化一般都为。本题的状态为:从左向右。
2024-12-11 18:03:26
440
原创 算法基础学习Day6(动态窗口)
我们可以通过直接遍历将数组,将所以可能全部找出来,然后将最长的数组返回即可。核心代码写完后后续将判断返回的内容加入即可。每次出窗口对长度进行判断求最大的长度即可。能移动到的最大位置就是窗口的初始化。又由于要求出最小长度就可以转化为。当然这是过不了的需要我们优化。那么这道题就变得简单了。指针并不用每次都回到。
2024-12-10 20:29:12
440
原创 算法基础学习Day5(双指针、动态窗口)
直接定义两个指针从前向后一次遍历,将所有的结果列举出来,直接进行求解。重复这两个步骤就可以得出我们想要的结果了。right指针没有必要每次都进行回退。判断是否出窗口(同时要记录值)判断是否出窗口(同时要记录值)我们在使用暴力解法的时候发现。
2024-12-09 18:19:38
906
原创 算法基础学习Day4(双指针)
所以后面就变成了和前一题一样的解法:找两个数的和。这里因为数组是有序的我们仍然要用指针的方法。不行时,去找比left大的数,直接让。向左移动了所以应该是。
2024-12-08 19:47:08
813
原创 算法基础学习Day3(双指针)
的数都可以组成三角形,直接将这部分的数组进行相加就行。,虽然能过但是还是可以进行优化的。这个优化在排完序的基础上。的数都没办法组成三角形。
2024-12-07 23:08:19
464
原创 算法基础学习Day2(双指针)
我们只需要判断链表是否有环:之前使用的是快慢双指针的方法,判断相遇时候的值即可。通过用两个指针将数组分开来算就可以从O(N*2)的时间复杂度转化为O(N)了。无论是情况一还是情况二,都会进入到一个循环中。来取到数字计算和,通过计算的和来模拟快慢指针。当然是过不了的,时间复杂度过大了。仍然不是真实的指针,而是用。我们可以先写一个求和函数。就可以来实现快慢指针了。
2024-12-06 21:53:21
314
原创 算法基础学习Day1(双指针)
这里推荐的仍然是双指针算法:先判断cur位置的值根据cur的值来决定dest向后移动一步或者两步判断一下dest是否已经到结束位置但是这里有个问题:如果在最后的时候出现了一个零,此时让dest向后++,就会导致dest直接越界,这里我们就要处理一下了。
2024-12-05 20:30:18
337
原创 C++基础:stack/queue/priority_queue的使用和简单实现
适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。**第二个栈:**如果第一个入栈的数据为最小的,就将其记录到第二个栈中(这里注意如果相等也要入栈,否则删除会很麻烦)本质是一个类,这个类重载了operator(),它的对象可以像函数一样去使用,本质就是对判断做了手脚。这里的地层实现和之前写的C语言的结构是差不多的,只不过语言写法上有区别。的变量来记录当前层有多少个数据,这个数据就是下一层数据的父节点。
2024-12-04 20:28:04
948
原创 C++基础:list的底层实现
但是这里会有些问题,在函数外面写的范围for支持,而函数内的范围for不支持了。这样我们只需要在调用的时候将要返回的参数写下来就能返回我们想要的迭代器。但是这样实现代码就显得重复度很高了,能不能直降返回的那部分替换掉呢?当然为了放在删除后迭代器失效,我们可以再删除后返回下一个节点的位置。当尾插写完后我们的其他插入方式就可以直接进行调用了。写完后我们就可以来完成begin和end的返回了。再将最后一个尾节点和头相连,成为新的尾节点。这里我们呢直接用新写法进行交换就行。将将节点的链接方式改变一下就行了。
2024-12-02 20:11:38
1416
原创 C++基础:list的基本使用
1.基本构造和插入删除基本构造和尾插数据迭代器的分类内置排序`sort`任意位置插入删除2.链表的合并,去重和剪切链表的合并链表去重链表的剪切
2024-12-02 19:48:34
763
原创 C++基础:vector中的深浅拷贝问题
我们可以用已经有的vector中的一段数据来构造我们新创建的vector。运行结束的时候调用析构函数就导致析构了两次,导致程序崩溃。这里我们第一次见到就是用类模版套里面套着函数模版的使用。既然写了构造和拷贝构造那也要将赋值重载也实现一下。那我们需要写一个构造函数来解决这个问题。在提出问题之前我们先写一个可以打印通用。可以用下标进行访问的基础,来实现深拷贝。的实现一样,都是函数仅仅进行了浅拷贝。这种的构造是为了我们进行初始化构造。清空,然后将数据一个一个尾插进去。但是这里要注意传的是值,并且注意。
2024-11-23 14:15:00
731
原创 C++基础:vector的底层实现
这里我们使用了模版就不能将声明的定义分离了,会出现链接错误。这里先进行判断vector是否为空,不为空直接将。指向的数字发生了变化,不在指向查找的数字了?但是现在运行程序却崩溃了,这是什么原因呢?我们可以用相对位置来修正这个pos的位置。这个函数利用迭代器可以进行查找。这里一旦扩容迭代器就失效了。当理解这个里面的实现很简单。我们先来了解一个库里的。
2024-11-22 22:56:30
777
原创 Linux进程概念(2)
系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。因为进程启动时会将UID记录下来,文件也会记录下来是谁创建的文件,将两者对比就可以判断出用户是否有权限做这些事情。在磁盘分区中有swap分区,当内存不足的时候,会将阻塞队列中的资源交换到swap分区中就是阻塞挂起。:多个进程在⼀个CPU下采用进程切换的方式,在⼀段时间之内,让多个进程都得以推进,称之为并发。如果将阻塞的全部挂起后资源仍然不够,就会将运行队列靠后的程序挂起,就是运行挂起。
2024-11-19 17:25:19
720
原创 Linux进程概念(1)
系统调⽤在使⽤上,功能⽐较基础,对⽤⼾的要求相对也⽐较⾼,所以,有⼼的开发者可以对部 分系统调⽤进⾏适度封装,从⽽形成库,有了库,就很有利于更上层⽤⼾或者开发者进⾏⼆次开 发。一个程序加载到内存中,这个程序是最不重要的,关于这个程序的描述(属性)更加重要而这个程序的描述就是PCB。可是数据层面上默认是共享的,但是一旦有人进行修改数据,OS就会将被修改的数据在底层拷贝一份(写时拷贝),我们的父进程和子进程拿着一样的代码,但是有不一样的id,可以执行不一样的代码。
2024-11-16 09:04:05
1056
原创 C++基础:string(4)和vector的基础使用
文章目录1.string的拷贝构造和赋值重载1.拷贝构造2.赋值重载3.引用计数(写时拷贝)2.vector的基本介绍1. 基本构造2. 遍历vector3. vector增删改查3.1 `vector::resize`3.2 `vector::push_back` 和 `vector::insert`3.3`vector`
2024-11-13 08:46:44
908
原创 Linux权限和开发工具(3)
我们在做项目的时候可能会遇到对自己的修改不满意,想要回到上一个版本时候,就需要对自己完成一个阶段,对当前阶段进行备份,就方便我们后续进行版本回退了。后的程序可以执行但是文件也会大一些,让生成的程序带上调试信息(debug模式)git管理只进行源文件的管理,而不是直接将库和临时文件直接提交到gitee上。如果我们Linux进行更新,在Windows如果没有进行更新,就会冲突。其实原本的gdb是非常难用的,因为无法将代码和调试信息同时看到。的操作将变化的部分提交上去,而并不是全部提交上去。
2024-11-11 11:01:36
910
原创 Linux权限和开发工具(2)
库是一套方法和数据集,为我们开发提供最基本的保障(基本接口,功能,加速我们的二次开发)库的内部实现方法,我们自己的程序回合库的方法链接起来形成可执行程序。找到大概100行,复制一行改成你想用sudo的用户就行。动态库会让程序跳转到库中执行,执行完后返回回来。而静态链接就是将库的内容直接拷贝过来使用。我们自己的程序要能找到库中的方法。来查看可执行程序链接的。首先要使用要找到文件。
2024-11-05 17:25:21
346
原创 C++基础:string底层的实现
将析构函数写出来后,我们进行测试就会发现,如果我们什么都不输入,进行输出的时候程序就会崩溃掉,删除的逻辑就是如果后面的参数比后面的字符多就将pos后面的全部删除,否则就仅仅删除中间的部分。这里空间扩容需要注意,可以直接按照上面的直接扩容,但是还是建议用下面的防止频繁扩容。会将空格和换行当作为字符的分隔符,将其直接忽略掉,所以提取不到,导致程序一直运行。还是和之间一样,我们先写两个,后面就直接调用我么之前写的函数就行了。迭代器屏蔽了底层的实现细节,提供了访问容器的方式,
2024-11-01 13:38:34
721
原创 C++基础: string(3)
这道题可以直接进行比较,但是时间复杂度就比较高了。我们这里可以用和计数排序一样的方法就可以解决。就和我们进行加减计算时候,从后向前进行计算。可以将任意位置的字符进行删除。可以将其他类型转换为字符串。如果找到了就返回下标。
2024-10-30 18:36:04
763
原创 C语言数据结构:排序(2)
稳定性指的是相同值相对顺序是否一致,例如:插入排序–稳定希尔排序–不稳定相同的数据预排序的时候分到不同的组,无法控制选择排序–不稳定在最后一次交换的时候,很有可能让确保不了最后的交换顺序堆排序–不稳定冒泡排序–稳定快速排序–不稳定key换到中间的时候也是不可控的归并排序–稳定。
2024-10-28 18:49:29
914
原创 排序(1)
稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列。排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。其实就是将选中的数,将其插入到其中,让其前面有序。
2024-10-22 20:37:41
1077
原创 C++ string(2)
C++11中,标准委员会变废为宝赋予了auto全新的含义即:auto不再是一个存储类型 指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期 推导而得。for循环后的括号由冒号“ :”分为两部分:第一部分是范围 内用于迭代的变量,第二部分则表示被迭代的范围,自动迭代,自动取数据,自动判断结束。当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际 只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
2024-10-21 20:57:29
1007
原创 Linux权限和开发工具(1)
vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且 还有一些新的特性在里面。但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安 装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装. 软件包和软件包管理器,vim的配置文件在每个用户的~目录下的.vimrc的隐藏文件下如果没有就执行基本操作,如果有就对vim进行配置。我们进入vim时,默认在命令模式。
2024-10-16 19:20:13
684
原创 C++类和对象
友元提供了⼀种突破类访问限定符封装的⽅式,友元分为:友元函数和友元类,在函数声明或者类 声明的前⾯加friend,并且把友元声明放到⼀个类的⾥⾯。友元类中的成员函数都可以是另⼀个类的友元函数,都可以访问另⼀个类中的私有和保护成员。静态成员函数中可以访问其他的静态成员,但是不能访问非静态的,因为没有this指针。友元类的关系是单向的,不具有交换性,⽐如A类是B类的友元,但是B类不是A类的友元。友元类关系不能传递,如果A是B的友元, B是C的友元,但是A不是C的友元。⼀个函数可以是多个类的友元函数。
2024-10-07 10:57:57
975
原创 Linux权限
你看上了小花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的bash。命令可以将自己的指令提权到root进行执行,而且是输入自己的密码,但是要自己在root的白名单中,这里我们在学会用vim后在进行更改。 b.特殊情况下,配置umask,可以控制文件的默认权限,让我们的代码都是可控的。我们创建的目录都会有对应的权限,那么这些权限是如何进行创建的呢,如何修改呢。
2024-09-28 19:29:05
890
原创 Linux基本指令(2)
而我们学过的文件操作中,每次都需要先打开文件,所以键盘显示器这些文件就在启动程序时打开了这些文件。我们也可以通过输出从定向来实现从一个终端向另一个终端中打印内容。带上后就可以递归将文件和子目录一起处理,否则就只会打包空文件。能将文件从Linux系统中传到Windows系统中。能将文件从Windows系统中传到Linux中。我们输入相对应的计算方法就可以得到相对应的结果。将后续的内容直接当成字符串进行打印。将文件内容反向打出到显示器上。在系统中查找相关的文件,压缩包。将文件的内容打印到显示器上。
2024-09-25 10:41:25
892
1
原创 Linux基本指令(1)
Linux操作系统一般都是指令来操作的,我们初步了解LInux就应该去学习一些简单的Linux指令这个指令一般用来连接我们Linux服务器的一个指令。
2024-09-23 13:40:24
672
1
原创 C++函数重载完成日期类相关计算
本文内容如下:1.创建类以及函数的声明2.日期加减天数1.月份天数2.函数实现3.日期比较大小4.日期减日期1.日期的前置和后置加加2.日期减日期的实现5.内置类型的cout和cin本文代码如下:要完成日期类的相关计算要创建自定义的类型,然后用函数重载来完成
2024-09-21 09:39:40
708
1
原创 C++初级学习:⼊⻔基础
定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响。
2024-07-26 16:17:39
660
原创 C语言数据结构:堆排序及TOP-K问题
本文内容如下:1.堆排序的直接应用2.堆排序的进阶使用2.1用向上调整来建堆2.2建队后的排序方法一:取根节点重新建堆方法二:建反堆2.3用向下调整来建堆3.建堆的时间复杂度的计算4.TOP-K问题1.堆排序的直接应用之前我们在建堆时将删除写的是从头部数据的删除如果我们将头部节点取下来在不断删除头节点就可以进行排序了写成代码:
2024-07-21 00:20:59
827
原创 C语言数据结构:二叉树堆的实现
双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点;孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点;如上图:B是A的孩子结点。叶结点或终端结点:度为0的结点称为叶结点;子孙:以某结点为根的子树中任一结点都称为该结点的子孙。非终端结点或分支结点:度不为0的结点;兄弟结点:具有相同父结点的结点互称为兄弟结点;结点的祖先:从根到该结点所经分支上的所有结点;结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推;结点的度:一个结点含有的子树的个数称为该结点的度;
2024-07-19 18:08:31
793
原创 C语言数据结构:队列的实现
这里删除要注意:如果队列中只有一个节点时,如果将一个删除那么ptail就为野指针,所以要分类。使用结构体将指针存入,进行结构体修改,既避免了传多个参数,又避免使用了二级指针。与栈相反,队列只能从对头进入,从队尾出,导致进队数据和出队数据是一致的。我们在取号时用的较多,让数据从队尾进入,从头取出数据。所以数组就很难实现,单链表能够实现的双向链表都能实现。这里由于后面要计数,所以对结构体进行加一个size。而对于队列来说,单链表加两个指针就可以实现。我们采用单链表的方式去实现队列。先创建队列(单链表)
2024-07-16 17:16:13
271
原创 C语言数据结构:栈的实现
本文内容:1.栈的基本概念2.栈的实现2.1栈的定义2.函数的声明和实现2.1栈的创建和销毁2.2入栈和出栈2.3取栈顶数据2.4判空2.5.栈的数据个数1.栈的基本概念栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。
2024-07-16 16:33:18
298
原创 C语言数据结构:链表相关题目补充2
本篇文章涉及到前面文章的相关内容:C语言简单的数据结构:单链表的有关算法题(1)C语言简单的数据结构:单链表的有关算法题(2)C语言数据结构:链表相关题目补充1本文内容如下:1.[环形链表1](https://leetcode.cn/problems/linked-list-cycle/description/)2.[环形链表2](https://leetcode.cn/problems/linked-list-cycle-ii/description/)解法一:数学思维解法二:改为链表相
2024-07-14 15:43:06
943
原创 C语言数据结构:链表相关题目补充1
这道题的解法有很多,可以通过先遍历一遍来获取链表长度,然后通过将倒数k个节点转换为正数k个节点来达到目的。由于我们并没有对前半部分的链表进行修改,所以2后面仍然指向原有的位置。那么要想比较数字,就只能将后半部分的链表进行反转,在从前向后遍历。那么问题就是找到链表的中间节点,和进行链表的反转两个问题了。用两个链表的长度相减 就是长的链表指针应当先走的距离。奇数个时2指向的数和逆置后的来链表2的数是一样的。这个问题我们可以通过两个相同的指针同时走来判断。那么后走的就是我们要找的节点。
2024-07-14 11:07:56
966
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人