自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

安然无虞的博客

包教包会包婚配

  • 博客(181)
  • 资源 (1)
  • 收藏
  • 关注

原创 蓝桥杯算法竞赛系列第九章·巧解哈希题,用这3种数据类型足矣

接下来就是,遍历数组中的每一个元素nums[i],先判断其值是否大于n,若大于,则说明其之前是非正整数,忽略它,继续向后遍历;考察了异位词的编码问题,对字符串排序可以是一种编码方案,如果是异位词,排序后就变成一样的了,但是这样时间复杂度略高,且会修改原始数据。的底层是红黑树,而红黑树是一种平衡二叉搜索树,所以key是有序的,但是key不可以修改,因为改动key会导致整棵树的错乱,所以只能删除或者增加。对key是有限制的,因为其不可以修改,对value是没有限制的,因为key的存储方式是使用红黑树实现的。

2023-11-07 15:10:00 1229 12

原创 为什么C++中的继承比Java设计的要复杂,原因竟出在这儿?

我们知道面向对象的三大特性有封装、继承和多态。可能有铁子会误以为面向对象只有这三大特性,其实不然,还有其他的特性,比如反射、抽象等。那今天我们就好好来说说C++是如何设计继承的,为什么说比Java的继承要复杂呢?下面我们看到Person类是父类,也叫基类;Student类是子类,也叫派生类。1、我们都说C++语法复杂,其实多继承就是一个体现。有了多继承,就会存在菱形继承,有了菱形继承就会有菱形虚拟继承,它们的底层实现相当复杂。...

2022-07-30 08:12:38 1989 41

原创 【请问】函数重载·真的讲明白了吗?

大家好,我是安然无虞。 上文说到,函数重载是这样定义的:要求:同一作用域中,函数名相同,函数参数不同,指的是参数个数/类型/顺序不同(形参类型顺序),注意哦,不关返回值类型的事。C语言不支持同名函数,但是C++支持比如:int Add(int left, int right){ return left + right;}double Add(double left, double ......

2022-05-17 07:45:00 1366 44

原创 【实用调试技巧】掌握了调试技巧,学习数据结构将会事半功倍。

文章目录 每篇前言一、什么是bug?二、拒绝迷信式调试1.调试是什么?2.调试的基本步骤3.Debug和Release的介绍三、学会使用快捷键四、调试时查看当前程序信息1.查看临时变量的值2.查看监视信息3.查看内存信息4.查看汇编信息5.查看寄存器信息6.查看函数调用堆栈五、多动手去调试,才能有进步六、经典的调试实例实例一:1!+2!+...+n!实例二:nice公司的笔试题七、如何写好代码·易于调试的代码1.优秀的代码2.代码示范3.const的作用七、编程常见的错误1.编译型错误2.链接性错误3.运行

2022-03-27 07:45:00 4772 53

原创 【内功】函数栈帧的创建和销毁

目录一、电脑存储二、简单例题讲解醍醐灌顶-原来是这样!<1>.局部变量是怎么创建的?<2>.为什么局部变量的值不初始化是随机的?<3>.函数是怎么传参的?传参的顺序是怎么样的?<4>.形参和实参是什么关系?<5>.函数调用结束后是怎么返回的?返回值是怎么带回来的?三、遇见安然遇见你,不负代码不负卿!【前言】这部分内容老师上课时不会说的哦,之所以写这篇是因为想让大家对于函数栈帧的创建和销毁这块内容有着更.

2021-12-31 21:23:39 1250 15

原创 Python中的回调函数和C中函数指针什么关系?

在同步I/O操作中,程序在发起一个I/O操作后,必须等待该操作完成才能继续执行后续代码。这意味着程序会在等待I/O操作的过程中阻塞,即不做任何事情。例如,当你从硬盘读取文件时,程序将停在那里,直到文件读取完成。在这期间,CPU不能做其他任务,这可能导致资源利用不充分,尤其是当I/O操作耗时较长时。这通常通过事件循环和回调、Promise(在JavaScript中)或 Future 和 async/await(在Python 3.5+中)这样的构造来实现。函数,用于处理下载完成的文件。

2024-04-14 11:37:14 567 23

原创 为什么在Python中总是使用【字典】这种类型呢?

但并不是所有的类型都可以做=作为字典的key,因为字典本质上是一个哈希表,而哈希表的key要求是可哈希的,因此字典中的key也必须是可哈希的,所谓的可哈希就是可以计算出一个哈希值。代码中的for循环对items的返回值执行遍历,也就是对列表中的一个个元组在进行遍历,每次遍历时将元组中的键和值分别赋值给key和value变量。使用 [ ] 可以根据key来新增或修改value,如果指定的key不存在,则为新增键值对,如果指定的key存在,则为修改键值对的值。

2024-03-30 19:32:51 1607 34

原创 Python中的列表跟C/C++里面的数组什么关系?

在Python中表示一个空列表。比如:还可以通过的方式来创建一个空列表,比如:创建列表时可以在中设置列表的初始值。比如:需要注意的是,列表可以存放不同类型的元素。比如:新增列表元素append方法比如:insert方法使用insert方法可以指定下标位置新增元素。比如:说明一下:比如:比如:remove方法比如:比如:查找列表元素in相关比如:index方法使用index方法也可以判断某个元素在列表中是否存在。比如:说明一下:这个就不用代码演示了,与C/C++中数组的

2024-01-13 17:59:37 1080 4

原创 啥,凭什么Python中函数的返回值可以有多个?

def 函数名(形参列表) : 函数体 return 语句一个函数可以有一个或者多个形参,也可以没有形参一个函数中可以有一个或者多个return语句,执行到return语句时函数会立即执行结束,返回到调用位置Python是动态类型语言,函数的形参和返回值都不必指定类型,因此一个函数可以支持多种不同类型的参数多个返回值Python中的函数可以有一个或者多个返回值,当有多个返回值时,使用 , 进行分隔。

2024-01-12 21:04:42 1019 1

原创 学完C/C++,再学Python是一种什么体验?

对于range函数的第三种使用方式,如果step的值为正数,那么start + n * step < end,如果step的值为负数,那么start + n * step > end.Python中浮点数在内存中存储的时候遵循IEEE754标准,这套标准在表示浮点数时可能会存在微小的误差,但这个误差在实际开发中不会造成太大的影响。字符串可以是用“单引号”,“双引号”,“三单引号”以及“三双引号”引起来的一串字符序列。Python中的算术运算符包括 +,-,*,/,%,**(幂),//(地板除)

2024-01-12 15:54:27 2139 28

原创 面试题:汉诺塔问题 · 递归

这道题的名字还是很响的,基本上都能看出来使用递归解题,但是具体怎么实现还是需要细细想一想。

2023-11-29 07:39:14 701

原创 【被面试官吊打系列】啥,你没说面试要考智力题呀?

举个例子,

2023-11-10 07:30:00 344 13

原创 MySQL第九讲·索引怎么提高查询的速度?

索引可以非常显著的提高数据查询的速度,数据表里包含的数据越多,效果越显著。我们应该选择经常被用做筛选条件的字段来创建索引,这样才能通过索引缩小实际读取数据表中数据的范围,发挥出索引的优势。如果有多个筛选的字段,而且经常一起出现,也可以用多个字段来创建组合索引。drop index 索引名 on 表名;当然, 有的索引不能用这种方法删除,比如主键索引,我们就必须通过修改表来删除索引。alter table 表名 drop primary key;

2023-11-09 07:30:00 5899 25

原创 MySQL第八讲·如何进行数学计算、字符串处理和条件判断?

上面只是介绍了一些常用到的函数,但在MySQL还有很多函数。遇见安然遇见你,不负代码不负卿。

2023-11-08 13:30:00 884

原创 蓝桥杯算法竞赛系列第十章·nSum问题的代码框架

首先,何为nSum问题呢?由此衍生出了两数之和,三数之和,四数之和……今天可借用一个算法框架,求解100Sum也不不在话下!题目要求:给你一个下标从 1 开始的整数数组 ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 的两个数。如果设这两个数分别是 和 ,则 。以长度为 2 的整数数组 的形式返回这两个整数的下标 和 。你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。你所设计的解决方案必须只使用常量级的额外空间。简单来说就是:看起来好像很简单

2023-11-08 07:45:00 403 11

原创 MySQL第七讲·怎么利用聚合函数实现高效地分组统计?

需要注意的是,求和函数获取的是分组中的合计数据,所以你要对分组的结果有准确的把握,否则就很容易搞错。在 MySQL 中,DATETIME 类型的默认格式是:YYYY-MM-DD,也就是说,年份 4 个字符,之后是“-”,然后是月份 2 个字符,之后又是“-”,然后是日 2 个字符,所以完整的年月日是 10 个字符。举个小例子,由于用户的销售数据很多,而且每天都在增长,因此,在做销售查询的时候,经常会遇到卡顿的问题。它的作用是,通过计算分组内指定字段值的和,以及分组内的记录数,算出分组内指定字段的平均值。

2023-11-07 21:25:41 1251

原创 MySQL第六讲·where和having的异同?

这样,我们就既利用了where条件的高效快速,又发挥了having可以使用包含分组统计函数的查询条件的优点,当数据量特别大的时候,运行效率会有很大的差别。首先我们需要把所有的信息都准备好,包括从关联表中获取的信息,对数据集进行分组,形成一个包含所有需要的信息的数据集合。可以看到,通过对销售数据按照交易日期和收银员进行分组,再对组内数据进行求和统计,就实现了对每天、每个收银员的销售数量和销售金额的查询。我们在进行查询的时候,经常需要按照条件对查询结果进行筛选,这就要用到条件语句where和having了。

2023-11-07 10:09:25 2287

原创 MySQL第五讲·关于外键和连接, 如何做到关联查询?

可以看到,我用到了 LEFT JOIN,意思是以表 demo.trans 中的数据记录为主,这个表中的数据记录要全部出现在结果集中,同时给出符合连接条件(a.cardno=b.cardno) 的表 demo.membermaster 中的字段 membername 的值。相应的,表B就是这个关系中的从表,表B中的id,就是表B用来引用表A中数据的,叫外键。不过,如果需要修改表的设计,比如添加新的字段,增加新的关联关系,但是没有预先定义外键约束,那么,就要用修改表的方式来补充定义。

2023-11-06 19:46:49 917

原创 MySQL第四讲·如何正确设置主键?

设置数据表主键的三种方式:数据表的业务字段做主键、添加自增字段做主键,以及添加手动赋值字段做主键。用业务字段做主键,看起来很简单,但是我们应该尽量避免这样做。因为我们无法预测未来会不会因为业务需要,而出现业务字段重复或者重用的情况。自增字段做主键,对于单机系统来说是没问题的。但是,如果有多台服务器,各自都可以录入数据,那就不一定适用了。因为如果每台机器各自产生的数据需要合并,就可能会出现主键重复的问题。我们可以。

2023-11-05 07:45:00 1528

原创 MySQL第三讲·SQL boy的CRUD操作

假设我们要把门店 B 的商品数据,插入到门店 A 的商品表中去,如果有重复的商品编号,就用门店 B 的条码,替换门店 A 的条码,用门店 B 的商品名称,替换门店 A 的商品名称;现在我们清楚了,部分插入一条数据记录是可以的,但前提是,没有赋值的字段,一定要让MySQL知道如何处理,比如可以为空、有默认值,或者是自增约束字段,等等,否则,MySQL会提示错误。MySQL支持的数据插入操作十分灵活,你既可以通过给表里面所有的字段赋值,完整的插入一条数据记录,也可以在插入记录的时候,只给部分字段赋值。

2023-11-04 07:45:00 368 1

原创 MySQL第二讲·表的创建与修改

因此,我们希望这个字段的值能够默认是1,这样一来,除非有特别的指定,否则,门店进货单的进货方式,就自动设置成1了。从这个表中,我们可以看到,这三个字段都不能满足唯一性,所以没有任何一个字段可以做主键,因此我们需要自己添加一个字段itemnumber,并且每次添加一条数据的时候,要给值增加1。这样,通过在创建表的时候设置默认值,我们就实现了将该字段的默认值定义为1的目的。非空约束表示字段值不能为空,如果创建表的时候,指明某个字段非空,那么添加数据的时候,这个字段必须有值,否则系统就会提示错误。

2023-11-03 15:52:49 2227 3

原创 MySQL第一讲·存储与字段

MySQL 中有很多字段类型,比如整数、文本、浮点数,等等。如果类型定义合理,就能节省存储空间,提升数据查询和处理的速度,相反,如果数据类型定义不合理,就有可能会导致数据超出取值范围,引发系统报错,甚至可能会出现计算错误的情况,进而影响到整个系统。所以我们需要掌握不同字段的类型,包括它们的适用场景,定义方法。

2023-11-03 07:45:00 1091 7

原创 随想录一刷·数组part2

【代码】随想录一刷·数组part2。

2023-11-02 08:44:45 95

原创 随想录一刷·数组part1

【代码】随想录一刷·数组part1。

2023-11-02 08:41:49 136

原创 哈希映射题·缺失的第一个正数

接下来就是,遍历数组中的每一个元素nums[i],先判断其值是否大于n,若大于,则说明其之前是非正整数,忽略它,继续向后遍历;注意:首先我们需要遍历数组中的每一个元素,比如nums[i],我们将以nums[i]为下标的元素中的值置换为其绝对值的相反数,也就是做标记。首先,我们遍历数组将数组中值为非正整数的元素全部忽略,什么意思呢就是将其值全部映射到n之外,所以我们遍历一遍数组,将值为负数和值为0的元素全部赋值为n+1;现在我们看到,只有2这个位置是没有做标记的,所以2就是所求。

2023-10-31 08:50:00 103

原创 24届秋招专场 · 数组如何用双指针解题呢?

定义快慢指针,fast遇到值不为val的元素就赋值给slow,并且slow++,请注意赋值和slow++的先后顺序,需要画图理解。今天更新使用双指针解决数组部分题型,注意哦,这里所说的双指针不是C语言中“指针”的概念,指的是数组的索引下标,不要混淆咯。理解了上面的数组题型,下面的链表就不难理解啦,只需要注意这里指针的指向即可。大家好,近期主要更新数组相关的解题算法咯,感兴趣的老铁可以一起看过来啦。仿照上面的解题思路即可,话不多说,开始刷题!

2023-06-16 10:14:13 820 1

原创 24届秋招专场·双指针巧解链表套路题

题目链接:链表中倒数最后K个节点题目描述:解题思路:本题是想找到链表的最后K个节点, 前提是要找到倒数第K个节点, 如何在一次遍历的情况下找到呢?

2023-05-31 20:16:27 1698 16

原创 释放内存流程

前面我们说了当 thread cache 某个自由链表过长时, 会还一段内存对象给 central cache 对应的span, 但到底是 central cache 中哪一个span, 这是需要计算的, 因为 central cache 中有很多个SpanList双向链表结构, 每个双向链表里面又有很多个span, 所以不同的内存对象可能对应不同的span.合并结束后, 需要将span挂到对应的双向链表中, 并且需要建立前后页到该span的映射, 方便后面合并出更大的span.

2023-02-24 22:01:19 1525 2

原创 page cache设计及实现

因为 page cache 是直接按照页数进行映射的, 因此我们要从 page cache 中获取一个k页的span, 就应该直接去找 page cache 的第k号桶, 如果第k号桶中有span, 那我们直接头删一个span返回给 central cache 就行了, 如果没有, 继续向下遍历直至最后一个桶, 在这期间, 如果第n号桶挂有n页的span非空, 将其分裂成一个k页的span和一个n-k页的span.表示页大小转换偏移, 这里我们按每页8K的大小为例, 那么。

2023-02-21 22:03:57 1796 1

原创 central cache设计及实现

span 是管理以页为单位的大块内存.// Span 管理一个以页为单位的大块内存 struct Span {// 大块内存起始页的页号 size_t _n = 0;// 页的数量 Span * _prev = nullptr;// 双向链表的结构 Span * _next = nullptr;// 切好的小块内存的自由链表 };

2023-02-16 21:30:37 1358

原创 项目整体框架 + thread cache设计及实现

这里我们暂时只提供一个申请内存对象的函数, 后面再进行补充. 对于申请内存对象的过程, 首先根据提供的字节数计算出映射到自由链表桶的下标, 如果这个自由链表非空, 则头删即可, 反之, 如果这个自由链表是空的, 则需要从 central cache 中获取, 这时需要使用 FetchFromCentralCache 函数, 这个我们会在后面补充.按照上面 8字节 的对齐方式, 如果你要10字节, 我给你16字节, 剩下的6字节用不上, 也就变成了内碎片(由于对齐的需求, 有的小块内存用不上).

2023-02-15 17:15:26 1156

原创 项目介绍 + 定长内存池设计及实现

这个项目是实现一个高并发的内存池, 它的原型是 Google 的一个开源项目 TCMalloc, 全称是 Thread-Caching Malloc, 即线程缓存的 malloc, 实现了高效的多线程内存管理, 用于替代系统中的内存分配函数(malloc, free).

2023-02-14 12:05:37 1291

原创 Linux系统编程·进程创建及终止

OS将不同的数据结构全部维护到一个链表中, 空间并没有释放, 只是设置为无效, 当再次创建进程时, OS会直接从这里拿出来相关的task_struct 和 mm_struct这些内核数据结构, 由此省去了开辟空间所花费的时间, 这样一来, 只要处理新进程的代码和数据的初始化工作即可.这里会提到一个概念, 叫做内核的数据结构缓冲池(slab分派器)当一个进程调用 fork 函数之后, 就会有两个二进制相同的代码的进程, 而且它们都运行到相同的地方, 但是每个进程都可以执行自己的代码.为什么用非零表征失败呢?

2022-11-10 17:33:55 1576 6

原创 Linux系统编程·进程地址空间

我们之前在C语言上面所学习的程序地址空间,是内存吗?其实不是内存,而且也不应该叫做程序地址空间,应该叫进程地址空间,这是操作系统上的概念。进程地址空间如下图所示分布:好,下面我们进行验证:验证一:进程地址空间验证验证二:验证堆和栈增长方向的问题很明显:堆的地址逐渐增大,栈的地址逐渐减小。验证了堆区向地址增大的方向增长,栈区向地址减小的地方增长,堆栈是相对而生的。所以一般在C函数中定义的变量,通常是在栈上保存的,那么先定义的变量一定是地址比较高的。验证三:如何理解 static 变量?函数

2022-11-10 06:45:00 1385

原创 Linux系统编程·进程优先级

所以,在Linux中, 如若要调整进程的优先级, 需要改变的是进程的 nice 值. 不过注意哦, nice 值是有范围的, 它的取值范围是 -20 到 19. 这个我们也能理解,可能有老铁会问了, 诶, 不对呀, 我的电脑是单CPU的, 但是我的电脑上好多个进程都在跑啊, 比如我一边在VS上敲代码, 一边打开QQ音乐听歌, 这是为什么呢?孤儿进程在父进程退出后,父进程成为init进程,进程退出,孤儿进程的资源将被init进程释放;CPU内的寄存器, 可以临时的存储数据, 非常少, 但是很重要.

2022-11-09 16:15:19 1738 2

原创 Linux系统编程·进程状态

前面我们说了进程的概念, 掌握了 fork 系统接口的基本使用, 那这里有一个问题就是: 我们在调用一个函数, 当这个函数准备 return 的时候, 这个函数的核心功能完成了吗?已经完成了, 此时:为了搞清楚正在运行的进程是什么意思, 我们需要知道进程的不同状态.运行态运行态指的是进程正在CPU上运行, 还是进程只要在运行队列中就叫做运行态?答案是进程只要在运行队列中就叫做运行态, 代表我已经准备好了, 随时可以被调度器调度.(正所谓, 时刻准备着!)终止状态指的是这个进程已经被释放了, 就叫做

2022-11-08 17:46:06 1495 1

原创 string·模拟实现

而此时另一些对象不知道该资源已经被释放, 以为还有效, 当继续对该资源进行操作时, 就会发生违规访问. 所以要解决浅拷贝问题, C++特意引入了深拷贝.

2022-11-08 09:54:15 1605

原创 Linux系统编程·进程概念

所以,这也就引入了下面的一个问题: 创建进程有很多方法, 如 ./你的程序(./myProcess), 每次执行./myProcess 时, 进程 pid 发生变化, 但是父进程 ppid 不变, 那为什么 ppid 不变, 父进程是谁呢?我们知道是不可以的, 那在我们的C语言中有没有可能两个以上的死循环同时运行, 这也是不可能的.程序是静态的指令集合,保存在程序文件中, 进程是程序的一次运行过程中的描述。这就好像我们前面说的那个学生的例子,所以为什么管理进程要有PCB呢?

2022-11-07 20:38:34 1779

原创 Linux系统编程·环境变量

所以,环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,比如我们在编写C/C++代码,在链接的时候,从来不知道我们所链接的动静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找;在讲解获取环境变量之前,请老铁回答我一个问题:我们之前使用C语言时,经常写main函数,所以我要问的是main函数可以带参数吗,最多可以带几个?我们看到,带上路径之后运行成功了,上面没带路径却报没有找到的错误,这是为什么呢?为什么系统的命令能找到,而我们自己的程序找不到呢?

2022-11-06 19:46:17 1529

原创 C++内存管理

在C语言中我们学习过内存管理方面的知识,比如malloc(), calloc(), realloc(), free()等,今天我们来看看C++是如何进行内存管理的。};//申请单个Date类型的空间 Date * p1 =(Date *) malloc(sizeof(Date));free(p1);//申请10个Date类型的空间 Date * p2 =(Date *) malloc(sizeof(Date) * 10);free(p2);

2022-10-28 06:45:00 1739 3

200个C程序.zip

200个C程序.zip

2021-10-28

空空如也

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

TA关注的人

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