自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 动态规划:0/1背包模板+例题详解(1)

由于dp[i][j]中i为了让商品编号和数组下标对应(1号商品对应1下标),观察状态转移方程i从1开始也是为了防止i - 1越界访问的问题,所以i是从1到i的,认为j = 0不合理,所以j的·取值范围是1到j所以dp数组就相当于在前面多开了一行和一列(i = 0,j = 0),那只需要初始化i = 0和j = 0那一行就可以了,因为dp表里面别的数据都可以通过这一行和一列推出来,这样多开一行和多开一列的初始化方法在动态规划里面还是比较常见的。,所以这个状态表示也是一定推不出状态表达式的!

2024-10-24 00:05:31 659

原创 智能指针(3)

我们会发现如果使用的是普通的开辟在栈里面的成员变量或者静态的全局变量都是跟着智能指针走的,但是我们的引用计数计数的是一个空间被多少个智能指针管理着,所以这个计数是肯定要跟着被管理的空间走的,以上两种表示方法在本质上就理解错了,追寻一个空间对应一个引用计数可知这个引用计数得另开辟一个空间管理,并且一个空间才开辟一个,也就是说只要遇到需要管理新空间时才新开辟智能指针。有的同学可能会认为不会让你自我实现,只需要懂得用就可以了,但是如下图越是大厂的面试题,可能或者一定是自我实现的部分(画蓝框的)的题还是相当多的!

2024-10-18 00:31:10 1023 1

原创 智能指针(2)

照成这种原因的本质就是引用计数的正常增加导致内部循环的部分无法释放,所以解决问题的关键计数使得内部循环引用的部分的引用计数不会增加就可以了,这时weak_ptr不会增加引用计数的优势就体现了,只需要将链表内部循环的部分的管理的智能指针换成weak_ptr就可以了。shared_ptr是不会出现引用失效的,因为它的引用计数是会变的,但是这里如果引用的是一个空的对象,也就是说shared_ptr为nullptr,那这里的引用计数就需要特殊处理的,实际是给0的,因为引用空的根本不需要管理。所以还是带上比较好。

2024-10-09 16:18:43 1011

原创 智能指针(1)

这个问题其实之前或多或少的提过,我们肯定是知道的,weak_ptr和shared_ptr的区别就是weak_ptr不支持RAII,不支持直接管理资源,为什么是直接呢,后面会讲,所以不能认为其不能管理资源,自然功能就不能向着RAII这方面答了,那功能就这剩下能解决shared_ptr循环引用导致内存泄露的问题。但是又很喜欢放在面试的最后才出现,所以对心理素质不好的考生非常不友好,可能前面已经被问懵了,到智能指针的时候就全都忘记了,考题都是有模板可以套的,相信看完这几篇文章智能指针这块满分在手!

2024-10-09 11:00:35 922

原创 不同的程序员会如何计算1+2+...+n

上面这种使用递归的方法虽然时间复杂度不会升高或者降低多少,但是没有使用循环,这个是关键点,当然如果有的人实在是看不懂的话,也可以使用栈这个数据结构进行对递归的正向调用,由于无论是使用栈还是递归都差不多,而且使用栈还得使用for循环,所有就不写了!由于我们刚刚在递归那里分析过了,你要计算当前i层的从1+...+i的值,就相当于要先计算i- 1层的值再加上i,这样如果我们定义dp[i] 的值为第i层的1+...+i的加和,那么第i层的值的状态就等于前一层的再加上i。为什么是对力扣比较了解的玩法呢?

2024-10-08 13:21:25 658

原创 python UNIT 3 选择与循环(2)

在循环部分有人会写成这个样子,也可以的,就是没有利用到条件直接的排除性,但是需要考虑两边的and的边界问题,也注意一下逻辑与的使用,python没有&&这个在C++表示逻辑与的字符。upper()函数的作用是将一个字符串的全部字符转换成大写的,原本就是大写的不变,这里使用这个就避免了大小写要辨别两次的问题。groups = {'优秀' : 0, '良':0, '中':0, '及格':0, '不及格':0}groups = {'优秀' : 0, '良':0, '中':0, '及格':0, '不及格':0}

2024-09-30 18:09:33 1072 1

原创 python UNIT3 选择与循环(1)

关于python的循环和选择结果的描述和之前的C++的循环和选择结构差不多的,但是在格式和写法上略有不同的,我们接着了解一下吧。

2024-09-30 12:50:41 1041 2

原创 B-树(不是B减树)原理剖析(1)

前些日子我们学了AVl树,红黑树感受到了搜索树在底层和实际应用的广泛和其规则的复杂性,今天我们继续学习一下原理也是搜索树的B-树。B树是一种自平衡的树数据结构,常用于实现数据库和文件系统的索引。它的设计目的是保持数据有序,并允许高效的插入、删除和搜索操作。B树的特点是它的节点可以包含多个子节点,而不是像二叉树那样每个节点只有两个子节点。这样可以减少树的高度,从而减少查找和更新操作的时间复杂度。:B树中的所有节点按升序排列,这使得查找非常高效。每个节点包含一个键值的有序列表,以及指向其子节点的指针。

2024-09-26 00:51:07 978

原创 Python可迭代对象(2)

◆ 字典的每个元素是用冒号分隔的键值对,即:key : value,元素之间用逗号分隔。#update的作用是将()里面的字典的键值对更新到调用此函数的字典中,要求更新过去的字典的键值对必须比待更新的。#字典就是通过K的值来取到V的值的,所有就是K(键)V(值)模型,这里的K值就是类似于V的下标一样的东西。# ➢set1.union(set2): 返回两个集合set1和set2的并集,即两集合的全部元素。# ▪使用get(K,(V))方法获取指定键K对应的值V,当键不存在的时候返回None或指定值。

2024-09-23 12:24:22 780

原创 Python可迭代对象(1)---从C++开发者学习python日记

这样做可以创建多维结构的列表。grades = [ ["Alice", 85, 90, 92], ["Bob", 78, 82, 80], ["Charlie", 90, 95, 88] ] ◆ 通过列表嵌套,可以方便地访问和操作多维数据。#由上面的访问-100,11,7,9下标都越界报错了,可以看出python列表的越界检查不是抽样式的,而是抛异常式的,这一点像C++的array。#copy的作用是返回列表的浅复制(相当于C++的浅拷贝)---copy可以将原列表复制到新的列表对象, 返回一个新的对象。

2024-09-23 00:35:04 1182

原创 C++11(3)

我们会发现所以传值传的是构造string的参数包(string的构造方法)的都只进行了构造没有拷贝,反而传的是类对象的都进行了拷贝,所以传args参数包的方式的效率比较高和参数包是不断往下传递的并且会直接拿参数包进行构造都得到了证实。emplace_back照样可以复用insert进行尾插,这里由于我们用来构造string而传的参数包都是典型的右值,所以每层传的参数都需要包证为右值(之前讲过了),但是之前用的都是move,这个会将原本是左值的东西直接转换成右值所以比较不好用,我们使用完美转发。

2024-09-18 16:48:53 731 1

原创 C++11(5)

std::bind函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),接受一个可 调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。一般而 言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M 可以大于N,但这么做没什么意义)参数的新函数。//传匿名对象也可以,因为这里的this对于包装器的作用主要是为了找到这个成员函数在哪里,自然指针可以帮助找到,匿名对象也可以的,这里和类型就没有关系了。

2024-09-17 17:57:31 611 1

原创 C++11(4)

可以看到图片//lambda那里有一个call 很长的一串字符,这个就是lambda对象的类型,这个可以看成是一个类(因为有类操作符::),类就是类型,由于太长了就简称lambda_uuid,所有lambda是有类型的并且可以取到的。//如果要取到ret的值就需要返回,因为出了func1函数的局部域就销毁了。//如果要取到ret的值就需要返回,因为出了func1函数的局部域就销毁了。//如果要取到ret的值就需要返回,因为出了func1函数的局部域就销毁了。

2024-09-17 11:16:57 896

原创 C++11(2)

传入上一个函数,完成浅拷贝,我们会发现这一路上只有所有函数都接收的是右值才会最后变成移动拷贝呀,又由于引用右值的值如果不做特殊处理是会被编译器默认为左值的(这个很容易证明,其实是由于引用右值的那个值是可以修改的,但是右值是不可以修改的,所以是左值),所以移动拷贝的那条路径上的所有函数的接收的左值都要强制性转换成右值,我们先都使用move一一进行修改,后面为了方便可以使用。传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,所以从现在开始我们 之前学习的引用就叫做左值引用。

2024-09-10 23:19:19 652 1

原创 哈希表的底层实现(2)---C++版

为什么扩容不复用insert了呢,先说一下为什么会需要扩容,随着数据的不断大量的插入单链表,肯定在某种情况下会使得某个链表过于长,这样在查找哈希表的时候会使得时间复杂度过于大了,所以引入负载因子n进行控制,当n == size时就扩容,为什么在扩容时不建议复用呢,因为这样不断的创造新的结点而放着旧结点不直接拿来用的话会比较浪费空间,创造一个结点的消耗还是比较大的。哈希桶的结构和链表是完全一样的,我们这边选择在每个vector里面装入单链表就可以了,比较简单嘛,所以每个结点和成员都是指针。

2024-09-09 13:08:34 615

原创 哈希表的底层实现(1)---C++版

比如2.1中的场景,现在需要插入元素44,先通过哈希函数计算哈希地址,hashAddr为4, 因此44理论上应该插在该位置,但是该位置已经放了值为4的元素,即发生哈希冲突。,首先对关键码集合用散列函数计算散列地址,具有相同地 址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链 接起来,各链表的头结点存储在哈希表中。//三个状态,这里定义了哈希表中的数据的多个状态,在红黑树的模拟实现中有用过,这样方便判断此位置的数据状态,方便以后的线性探测和删除数据等。

2024-09-08 23:35:46 784

原创 C++11(1)

相比于 C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中 约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。1998年是C++标准委员会成立的第一年,本来计划以后每5年视实际需要更新一次标准,C++国际 标准委员会在研究C++ 03的下一个版本的时候,一开始计划是2007年发布,所以最初这个标准叫 C++ 07。所以最终定名为C++11。,C++11 引入了移动语义,极大地提升了对象转移时的性能,避免了不必要的深拷贝。

2024-09-07 15:21:25 1292

原创 红黑树总结(RbTree)——C++版

首先要变色首先每个结点的颜色是我们首要关注的点,g肯定是黑色的,不然p就不可能再是红色的并且还能存在,cur为新插入的结点所以必须是红色的,那其实在考虑变色和是否需要旋转的时候就只需要考虑u的颜色和是不是存在了。插入结点还是和原本搜索树一样,由于红黑树的特殊规则,头节点必须是黑色的,每条路径的黑结点个数都是一样的,所以我们每次无论在那条路径新插入结点都必须是红色的,这样是为了不破坏当条路径的黑结点个数。由于左旋和右旋的逻辑差不多,所以就不做过多的解释了,详细的请看上面左旋的逻辑,还是那句话要学会画图!

2024-09-04 22:06:49 925

原创 动态规划与0/1背包问题:深入解析

这是因为在计算 dp[i][j]时,只需要参考 dp[i−1][j]和 dp[i−1][j−wi] 两个状态,因此可以使用一维数组进行优化。通过本文的详细解析和多个例题的讲解,我们可以深入理解动态规划及其在0/1背包问题中的应用。因此,状态转移方程为: dp[i][j]=max⁡(dp[i−1][j],dp[i−1][j−wi]+vi)// 创建一个二维数组 dp,大小为 (n+1) x (W+1),并初始化为 0。// 最终结果是 dp[n][W],即考虑所有物品在最大重量 W 时的最大价值。

2024-08-02 12:09:34 1333 1

原创 二分查找理论及部分试题剖析

没关系,由于本题的数据全部都是整型的,那就可以用映射,哈希表的底层理论也是映射,先建一个数组,这个数组的大小为原数组的最大值减去最小值再加1,然后将原数组的元素的最小值映射到数组的对应下标的位置,然后加1,等全部数字都映射完,然后遍历一变映射数组,看一下哪一个下标下没有数字,那个没有数字的下标就是缺少的数据。没有前半部分,由于我们上述分析可得,缺少值一定会被找到在后半部分的第一个元素的下标,此时当跳出循环时,理论上返回的下标就是0,这种情况的缺少值也的确是0,所以这种情况不用特殊处理了。

2024-06-05 13:03:34 720 8

原创 string功能介绍(普及版)

但是类里的std是可以交换string类型的数据的,所以可以直接使用std里面的swap交换两个string,交换两个string类型的数据时可以直接交换指向两块空间的指针,这样可以减少拷贝构造的产生。//find_first_not_of 的意思是在一个字符串中从前往后查找find_first_not_of函数中输入的字符串的不相同的字符,找到不相同的字符就返回对应的下标,然后再找下一个。

2024-05-15 00:29:10 1467 11

原创 排序超详解---一篇文章带你掌握所有实用的排序方法

本文主要是对我已知的所有排序方法进行总结。排序我们很早在学C语言的时候就接触过,比如冒泡排序,qsort的底层逻辑就是快速排序。我们今天不是要翻旧账,而是要把排序一家一锅全端了。本节内容难度适中,就是有点费脑,请最好先学习了数据结构的相关知识再来观看此文。话不多说我们现在开始:一。冒泡排序(Bubblesort)根据以上动图可以得出冒泡排序的精髓就是用前一个和后一个比,如果前一个数大于后一个数就交换一下,然后如此操作n个数据就会有n - 1次冒泡排序。

2024-03-29 17:23:16 692 4

原创 力扣622:设计循环队列(中等)

一般我们入手的队列都是单项不循环的,所以我们会更倾向于选择用链表来实现,并且会选择单链表来简化队列先入先出的规则,但是这个题可能会颠覆你的认知。我们再来看看chargpt3.5给出的循环队列的演示图(足够细致了):思考这个题要我们从0开始实现循环队列,那再用单链表就不太可能了,因为循环不了嘛。这个时候脑洞比较大的人比如我,就会想到很早做过的约瑟夫环,单项循环链表,带不带头无所谓的(带头反而浪费空间)。方案一:用单项循环链表。

2024-03-03 22:21:48 874 6

原创 编程环境和预处理(精选)

由于是后置++所以是先代入再++,这里就有先后之分了(循环语句没有),由于a比b小所以,m = :后面的b++但是由于a和b在前面已经加加过了,所以m = b++,b还要再加加,所以b就相当于++了两次,所以b = 7,a 也相当于加了两次,所以a = 4,但是由于m = b++,又是一个后置++,先代入再加加,b在第2次++还没进行时就待入m了,所以m = 6。就是说,如果头文件是用包括的,计算机就会直接在库里面找,如果是用""包括的计算机会先在当前文件中找,等到找不到了再去库里面找。

2024-01-22 17:50:33 1055

原创 C语言文件操作(精选)

第一个参数为文件指针,第二个参数为所起始光标所对应的偏移量(人为可控),offset如果是正的就是向右偏移(偏移到前面),如果是负的就向左偏移(偏移到后面),第三个参数origin是系统已给的三个参数之一,SEEK_SET是光标的起始位置为字符串最开始的位置(就是从第一个元素的位置开始偏移),SEEK_CUR就是从光标当前位置开始偏移,SEEK_END就是从字符串最后的位置(就是从最后一个元素\0的位置开始偏移)这三个参数一定是全大写的,并且在使用fseek时要防止越界读取。,那流有什么作用呢?

2023-12-29 17:35:24 481 2

原创 妈妈放心系列2:库函数和内存函数的模拟实现(C语言)

strcmp是字符串长度比较函数比较的是每位字母的ASCLL码值,strcmp(arr1, arr2)对于strcmp的两个参数,如果arr1等于arr2,就返回0,arr1大于arr2,就返回大于0(一般是1),反之则返回小于0(一般为-1)。这个的模拟实现会比较难一点,也是用两个指针同时同步来遍历整个数组,如果有一个地方不相等就可以比较出两个字符串的大小,如果相等就进入循环如果历遍到\0了还是相等的话,就说明两个字符串不仅相等里面的元素还是一样的。所以是size_t,打印也是用的%zd。

2023-12-19 16:23:42 1148

原创 妈妈放心系列---数据(整型和浮点型)在内存中的存储和动态内存管理的相关笔试题,结构体的相关基本运算,联合体的基本运算和应用。

题目一本系列是从C语言地狱难特辑中精选出来的,用于备考,复习。本文理解起来不会太难。主张一个由浅入深,有点基础就能学会。相关的笔试题都有标注可以依照个人能力进行掌握。废话不多说,开始今天的内容!!!!!!!!!!一。数据在内存中的存储的相关笔试题题目一int main()//VS认为char是有符号的//存储在a中要发生截断//11111111111111111111111111111111//整型提升,提升是提升符号位,负的就全提成1,正的就提成0。

2023-12-11 13:01:23 1008 3

原创 C语言地狱难度特辑精选2:与指针运算和数据在内存中的存储相关的笔试题

上篇博客的内容只能给到一个量子微难,比较简单,如果你可以很好理解并掌握,那没什么好说的了,跟上我的节奏吧,开始今天的内容。还是那句话,如果感觉本节太难了,已经理解不了了,就算了。毕竟基础才是最重要的。要读懂本节需先掌握指针初阶进阶的所有知识,一维,二维数组的所有知识,结构体的所有知识。本节内容在本特辑也就可以给到一个量子中难,看能不能使你十分闭塞的眼界变得宽敞一点话不多说,现在开始!!!!!!!!!!

2023-12-03 11:36:59 985 4

原创 C语言地狱难度特集精选1:sizeof和strlen辨别和计算

如果你看完我的上篇博客----C语言指针进阶(选修)还觉得so easy,还能很好理解并掌握理解并感觉很轻松的话!!!恭喜你解锁《C语言地狱难度特集》,作者当然就是我了。本节为精选的第一个小内容,还是那句话,如果感觉本节太难了,已经理解不了了,就算了。毕竟基础才是最重要的。要读懂本节需要先掌握指针的初阶进阶的所有知识,一维二维数组的所有知识,sizeof和strlen的基本知识。话不多说现在开始!!!!!!!!!

2023-11-28 17:54:27 996 2

原创 C语言指针进阶(选修)

本章讲述的是C语言指针中的选修部分,我个人感觉是特别难的内容,在看本片博客前,请先学习指针初阶,循环语句,qsort函数的使用,函数调用,函数声明,函数定义等的相关基础内容,结构体初阶的相关知识,冒泡排序基本理论的应用,并且学会使用Cplusplus网站的使用。废话不多说,现在开始我的表演。

2023-11-20 17:12:43 237 3

原创 指针和数组的关系

本节讲的是指针和数组的关系,属于指针初阶的內容,要观看本文请先学完指针初阶的相关基础內容,本文只补充难度比较大的部分!!!仅为个人理解,由于个人水平原因,可能不够专业。下面正片开始。

2023-11-13 12:54:08 118 1

原创 C语言位操作符的几个你不知道的妙用

只有在一位中有1,其他位都是0,那只要将仅有的1挑出来让此为0,此过程还只执行1次,那就说明那个数n就是2的次方数,n - 1刚好时原来为1的那位变0,而使后面为0的位变为1,这样(n & (n - 1)==0的话,就说明n为2的次方数。首先1的补码只有最后一位是1,那如果一个数记为a的补码最后一位也是1,那将1& a,是不是最后的结果也是1,如果a为正数,那另外31位都是0,因为两个都是1才得1,然后再将a向右移1,位操作符的运算法则,反码,原码,补码的运算法则,10进制转2进制的方法,移位操作符用法。

2023-11-06 17:27:47 168 2

原创 Debug和Release,x64和x86的差别解答

release有净化,优化代码并且优化观察的作用,所以如果i的地址比arr的要高,那一定会陷入死循环的,release为了避免死循环,就会使地址由低到高打印,使之不会死循环,运行的结果也证实了这个结论!(这边一定要选一个好观察的地址,可以反复执行,因为每次地址都不一样),这里有人就有疑问了,你上一个博客不是说。首先本文是基于我的C语言调试的保姆级教程而增加的內容,仅起补充叙述作用,请先看完我的C语言调试技巧再来看这个比较好哦,(一定得是我的,别人的可能没有这个內容)的吗,怎么这里不一样了?

2023-11-04 00:52:53 364 5

原创 C语言的简单调试技巧(个人史无前例的保姆级教程)

当程序员写完代码,测试再对程序进⾏测试,直到程序的质量符合交付给⽤⼾ 使⽤的标准,这个时候就会设置为 release ,编译产⽣的就是 release 版本的可执⾏程序,这个 版本是⽤⼾使⽤的,⽆需包含调试信息等。调试⼀个程序,⾸先是承认出现了问题,然后通过各种⼿段去定位问题的位置,可能是逐过程的调 试,也可能是隔离和屏蔽代码的⽅式,找到问题所的位置,然后确定错误产⽣的原因,再修复代码, 重新测试。在打开内存窗⼝后,要在地址栏 比特就业课 输⼊:arr,&num,&c,这类地址,就能观察到该地址处的数据。

2023-11-02 01:08:25 594 3

原创 c语言项目:扫雷游戏

printf("很遗憾,你被炸死了\n");//存放排查出的雷的信息。#include "game.h"//为了使用自定义头文件里的函数要用''printf("--------扫雷游戏-------\n");printf("坐标⾮法,重新输⼊\n");printf("选择错误,重新选择\n");#include "game.h"//为了能使用头文件里的参数//printf("请输⼊要排查的坐标:>");printf("恭喜你,排雷成功\n");printf("退出游戏\n");//⽣成随机的坐标,布置雷。

2023-10-30 23:52:10 103 1

空空如也

空空如也

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

TA关注的人

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