自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 python_入门基础语法(2)

本文主要介绍了Python基础语法中的条件语句、循环语句、函数定义与使用、列表/元组/字典操作以及文件读写等内容。在条件语句部分讲解了if-elif-else结构;循环语句介绍了while和for循环,特别说明了Python特有的range函数和可迭代对象概念;函数部分重点讲解了参数传递、返回值和作用域规则;数据结构部分对比了列表和元组的异同,详细说明了字典的使用方法;文件操作部分介绍了文件路径、打开方式及读写方法。文章还提及了Python特有的编程规范要求,如缩进规则和PEP8规范

2025-05-26 21:33:35 986

原创 python_入门基础语法(1)

本文主要介绍了Python基础语法与C++/Java的主要区别。Python采用动态类型,变量类型在运行时确定,且整型无大小限制,浮点型仅float一种但相当于双精度。字符串使用灵活,单/双引号等价,支持三引号处理复杂字符串。输入输出使用input()和print(),支持f-string格式化。运算符方面,算术运算包含**幂运算和//地板除;关系运算符可直接比较字符串;逻辑运算符支持and/or/not及短路求值。Python特有赋值方式如多元赋值(a,b=1,2)和复合赋值(+=),但去除了易混淆的++

2025-05-25 17:57:38 916

原创 C++_AVL树

本文介绍了多种搜索数据的方法,包括暴力搜索、二分搜索、二叉搜索树、二叉平衡搜索树(如AVL树和红黑树)、多叉平衡搜索树(如B树)和哈希表。重点讨论了AVL树,它是一种自平衡二叉搜索树,通过确保每个节点的左右子树高度差不超过1来维持平衡。文章详细阐述了AVL树的概念、节点定义、插入操作、旋转操作(包括左单旋、右单旋和双旋)以及验证和删除操作。AVL树在查询时具有高效的时间复杂度(O(log N)),但在频繁插入和删除时性能较低,因此适合用于数据静态且需要高效查询的场景。

2025-05-19 22:20:54 1134

原创 C++_STL_map与set

关联式容器与序列式容器的主要区别在于存储结构。序列式容器如vector、list等,底层为线性序列,存储元素本身;而关联式容器如map、set等,存储键值对,数据检索效率更高。键值对由key和value组成,key用于唯一标识元素,value存储与key关联的信息。STL中的关联式容器分为树形结构和哈希结构,树形结构包括map、set、multimap、multiset,底层使用平衡搜索树(红黑树),元素有序。set存储唯一元素,不允许修改,查找时间复杂度为O(log n)。

2025-05-16 18:49:53 1191

原创 C++_进阶_异常

C语言传统的错误处理方式主要包括终止程序(如使用assert)和返回错误码。终止程序的方式在发生严重错误时使用,但用户体验较差;返回错误码则需要程序员自行处理错误,常见于系统库函数中。C++引入了异常处理机制,通过throw抛出异常,try/catch捕获和处理异常。异常处理允许在函数无法处理错误时,将错误传递给调用链中的上层函数处理。C++异常处理机制包括异常抛出、捕获、重新抛出、异常安全、异常规范和自定义异常体系等。异常处理的优点在于能够清晰展示错误信息,简化错误处理流程,但缺点包括执行流混乱、性能开销

2025-05-15 12:31:13 1062

原创 c++——二叉树进阶

本节内容主要围绕二叉搜索树(BST)展开,旨在通过二叉搜索树的学习,进一步理解map和set等数据结构的特性。二叉搜索树是一种特殊的二叉树,具有左子树节点值小于根节点、右子树节点值大于根节点的性质。文章详细介绍了二叉搜索树的基本操作,包括查找、插入和删除,并提供了递归和非递归的实现方式。此外,还探讨了二叉搜索树在实际应用中的两种模型:key搜索模型和key-value搜索模型。最后,文章通过几道LeetCode题目,展示了二叉搜索树在面试题中的应用,如二叉树的字符串表示、最近公共祖先、二叉搜索树

2025-05-10 23:30:44 1335

原创 C++进阶之——多态

本文章详细解答了多态的定义和原理,而且提供许多大厂考过的原题

2025-05-05 18:26:26 950

原创 c++ 中的继承

下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类。1很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱 形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设 计出菱形继承。否则在复杂度及性能上都有问题。2. 多继承可以认为是C++的缺陷之一,很多后来的OO(面向对象)语言都没有多继承,如Java。3. 继承和组合(1)继承和组合的区别就是:组合在类里面有定义其他的类,两者都是一种复用,都能用相应的成员和函数。

2025-05-02 12:43:15 1096

原创 模板--进阶

【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误。

2025-04-28 22:20:00 1098

原创 stack __ queue(栈和队列)

下面用一些题来深入理解栈的压入、弹出序列_牛客题霸_牛客网这一题就不能找规律,这样就会陷入死胡同,正确的解法就是我们判断的一样我们判断就是通过想着一个模拟实现的栈,只要这个栈的top与出栈开头不同就入栈,相同pop最后看这个栈是否全出了这里里面用out来判断是否出完(若没出完就入,当入完的时候就是false)150. 逆波兰表达式求值 - 力扣(LeetCode)这里涉及到了表达式求解如正常的一个表达式 2+1*3这个表达式是前缀表达式,计算机是无法进行运算的,但是后缀表达式就可以。

2025-04-25 12:28:21 1038

原创 反向迭代器的实现

再写一个反向迭代器,只是在++的地方变为--,--的地方变为++同时rbegin 和rend与我们想象的指向位置不同。不是针对谁去写反向迭代器,而是去针对所有的类型。让解引用进行了错位,可以让便利正常进行。1要啥就传过来,如T* 和 T&2走一个萃取,可以把T 萃取出来。反向迭代器与正向迭代器是。但是写的模板不知道T类型。

2025-04-25 12:28:12 157

原创 list的模拟实现和学习

说白了就是带头循环双向循环链表stl 的两大组件就是容器和算法 ,他们两个之间是通过迭代器进行联系的这三种算法函数迭代器的种类 性质(容器底层结构决定)单项:++ forward_list /哈希(unordered_xxx)双向:++ / -- list/map/set随机:++/--/+/- vector /string/deque。

2025-03-23 23:04:51 509

原创 vector(向量)

范围for 在用在自定义类型的时候要用引用,因为拷贝的代价大。

2025-03-17 13:02:47 937

原创 STL 简介+string

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可 能还会越界访问。

2025-03-10 17:55:13 1086

原创 模板-初阶

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>(也就是必须显式实例化),然后将实例化的类型放在<> 中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

2025-03-01 13:10:42 299

原创 c/c++内存管理

new的原理1. 调用operator new函数申请空间(最底层还是用malloc)2. 在申请的空间上执行构造函数,完成对象的构造delete的原理1. 在空间上执行析构函数,完成对象中资源的清理工作2. 调用operator delete函数释放对象的空间(还是用free)new T[N]的原理1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申 请2. 在申请的空间上执行N次构造函数delete[]的原理。

2025-02-27 21:34:34 705 1

原创 类和对象(下)

建议是,声明和初始化一致。

2025-02-26 16:39:50 931

原创 类与对象(中)

我么可以看见 ,虽然默认会生成构造函数 但是这也是祖师爷留下的一个坑,就是不会去初始化(有函数)c++类型分为1内置类型/基本类型 ----语言本身定义的基础类型 int/char.double 指针等等2自定义类型,用struct/class等定义的类型注意上面就是在定义d1的时候传的参数!!!但是什么时候要自己写构造函数呢?(最终还是要自己写构造函数--->对自定义类型)1内置类型成员完成值拷贝/浅拷贝2自定义类型会调用他的拷贝构造问题 1 析构两次,报错 2一个修改会影响另一个。

2025-01-15 08:28:24 1659

原创 类与对象(上)

这就是写的第一个类上面的结构体定义 c++中更喜欢用class 代替struct在类里面定义的函数默认就是inline (规定)

2025-01-04 16:51:49 271

原创 c++入门 LESSON1

但当n时动态对象时 结果是不确定的(n空间被销毁)(如果栈帧没有被清理 结果侥幸正确 但要是被清理 结果就是随机值)展开相当于暴露到全局 ---即若定义了全局变量 同时展开了namespace里面的同名变量会报错。1 做参数 (1输出型参数如 Swap函数)(2提高效率---》大对象/深拷贝)即 函数名相同 参数相同 返回值不相同(就是函数的参数) 不构成重载!在取别名的时候才会有权限的概念(函数返回的时候也会出现临时变量)但是指定展开麻烦 但是展开又会有冲突(即不要轻易的展开)

2025-01-01 16:35:49 460

原创 c++入门 LESSON0

2 整体而言 Java方向的学习成本和c++学习成本差不多。c++ 学完后就不会再想用 c写代码了。c++确实就是最难学的语言之一。1java的语法学习比c++简单。要做笔记(知识点很多)4. 如何学习C++

2024-12-29 22:31:27 327

原创 数据结构:排序

因为外面一层为logN 经过预排序后 里面的循环分两端(gap 很大 和gap很小)但都是N。两个有序区间归并的思路:依次比较,小的尾插到新空间(思路和后序遍历差不多)与gap有关 N*logN (底数就是gap)----这个是可以近似看为。比如间隔为3 的分为一组 一共分了三次 (能使大的更快的跳到后面)选出一个基准值 key 把他放到正确的位置(最终排好序要蹲的位置)1:预排序 ---目的是为了使数组接近有序 ————分组排序。插入排序法: 时间复杂度为O(N)~O(N^2)

2024-12-28 21:26:07 477

原创 二叉树 概念和结构

DFS :深度优先遍历(一般用递归) :走到无路可走就往回退(最经典为前序遍历)(三种序列都是深度优先遍历 但是要看有没有严格要求什么时候访问节点)BFS:广度优先遍历(一般用队列) :对于二叉树就是层序遍历(针对二叉树)向上调整建堆:从上向下看,调整次数少,节点个数少,到最后两个都多,在堆中插入元素时要操作的是数组 但在逻辑上看是操作的是二叉树。目前学的二叉树(普通)没有作用,用二叉树来存储数据就更高大上嘛?物理结构:实实在在在内存中是如何存储的(就是树下面的数组)4.二叉树链式结构及实现。

2024-12-22 16:01:19 367

原创 数据结构 :栈和队列

数组模拟链表---就是结构数组 一个是data 一个是下一个元素的下标。函数调用 里面 栈 操作系统,内存区域划分。要是用链表(单链表)也可以(此时是头插和头删 尾删不能实现)malloc 堆。局部变量 变量储存 栈 数据结构。是两个学科 不同的名字。

2024-12-16 16:28:25 247

原创 力扣138随机链表的复制

138. 随机链表的复制 - 力扣(LeetCode)

2024-12-12 10:19:26 172

原创 链表的概念和实现

1 存储的数据 2, 指针(指向下一个节点)这个链表不可能为空,插入不需要再判断空指针的情况。在创建带头双向循环链表是要用到初始化函数。尾插时先找到为尾节点,用while循环。哨兵位的next指向第一个元素。顺序表和链表是数据结构的内容。尾的next指向哨兵位的头。物理结构:不一定是线性的。链表是由一个一个节点组成。逻辑结构:一定是线性的。链表也是线性表的一种。

2024-12-11 16:58:38 204

原创 单片机的介绍

模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "XXX.h"文件即可。传统方式编程:所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路。但在性能上,与计算机相差甚远,但单片机成本低、体积小、结构简单,在生活和工业控制领域大有所用。单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制。

2024-12-11 16:58:31 1934

原创 环形链表找头部

记住结论的同时要能推导。

2024-12-10 17:24:36 105

原创 算法的时间复杂度和空间复杂度

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一 个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知 道。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法 的时间复杂度。因此衡量一个算法的好坏,一般 是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。大部分的空间复杂度为O(N)或者O(1)

2024-12-01 16:18:01 259

原创 数据结构初阶 LEASSON1

算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的 数据元素的集合。(在内存当中管理数据)剑指offer等学完了数据结构就可刷题。代码一定要自己能写出来就可以了。c++初阶后就可以刷力扣。

2024-11-30 14:49:00 208

原创 顺序表专题

线性表是⼀种在实际中⼴泛使 ⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的⼀条直线。, 线性表在物理上存储时,通常以数组和链式结构的形式存储。线性表指的是具有部分相同特性的⼀类数据结构的集合 如何理解逻辑结构和物理结构?在增容时一般是成倍数增加 两倍或三倍(频繁的增容就会造成程序的运行效率降低)顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝。数据结构: 是计算机储存,组织是数据的方式。1,顺序表的概念及结构。

2024-11-27 15:59:05 153

原创 操作符详解

:两数的某二进制位都为1 那么就为1, 其中只要有一个不为1, 整体就为0 6&-7==0。移位操作符(移动的时二进制位)(移动的是补码)(浮点数不能移位)(移动的位数是正数)右移分为逻辑右移和算数右移(具体哪一种取决于编译器,但通常位算术右移)~:(前三个都是双目预算符, 这个是单目)就是把二进制位全部取反。|:同理只要其中有一个位1,那么就为1,两个数全为0, 才为0。算数右移左边用原符号位填充, 右边丢弃。^:对应的二进制位相同为0,相异为1。逻辑右移就是左边补0,右边丢弃。

2024-11-26 11:38:35 210

原创 扫雷游戏的实践

如果棋盘的大小为9*9,数组的大小就为11*11(大一圈 防止了越界)(创建时使用字符数组就可以 因为这样不用写两套数组)排查雷1:输入一个坐标 2:判断是否越界3:判断是否是雷, 若是雷就炸死,不是雷就显示周围雷的个数。雷的信息用二维数组来存放 用两个数组 一个放雷 一个放排查出的信息 都用字符数组。排查雷 这个位置是雷就炸死,游戏结束,不是的话就告诉这个地方周围有几个雷。’1‘-’0‘=1 就为 49-48。test.c-----扫雷游戏的测试。把所有位置都找到 游戏结束。

2024-11-23 14:55:56 223

原创 预处理详解

2. 更为重要的是函数的参数必须声明为特定的类型。宏的参数是类型⽆关 的。提⽰: 所以⽤于对数值表达式进⾏求值的宏定义都应该⽤这种⽅式加上括号,避免在使⽤宏时由于参数中的 操作符或邻近操作符之间不可预料的相互作⽤。的时候,如果参数带有副作⽤,那么你在使⽤这个宏的时候就可 能出现危险,导致不可预测的后果。#define机制包括了⼀个规定,允许把参数替换到⽂本中,这种实现通常称为宏(macro)或定义宏 (define macro)。1. 每次使⽤宏的时候,⼀份宏定义的代码将插⼊到程序中。

2024-11-17 22:17:02 409

原创 文件操作

ANSIC标准采⽤“缓冲⽂件系统”处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为 程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。缓 冲区的⼤⼩根据C编译系统决定的。每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名 字,⽂件状态及⽂件当前的位置等)。我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出 操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流 想象成流淌着字符的河。

2024-11-15 22:18:58 1603

原创 动态内存管理

包含柔性数组成员的结构⽤malloc ()函数进⾏内存的动态分配,并且分配的内存应该⼤于结构的⼤。所以如果我们对申请的内存空间的内容要求初始化,那么可以很⽅便的使⽤calloc函数来完成任务。C99 中,结构中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员。返回栈空间地址的问题(即用malloc开辟空间返回就可以)sizeof 返回的这种结构⼤⼩不包括柔性数组的内存。**malloc申请的空间和数组的空间有什么区别呢?情况2 :2会将旧的数据拷贝到新的空间。1,动态内存的大小是可以调整的。

2024-11-11 11:45:07 255

原创 自定义类型——枚举和联合

联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合 ⾄少得有能⼒保存最⼤的那个成员)。当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。联合的⼤⼩⾄少是最⼤成员的⼤⼩。(不一定位最大成员的大小)*空间是重复的即不能同时使用两个成员,联合体在一定程度上可以节省空间。写代码多了就会感悟到枚举的作用。结构体的关键字:struct。联合体的关键字:union。枚举的关键字:enum。枚举关键字 enum。

2024-11-08 21:55:22 188

原创 自定义类型:结构体

4.如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。4. 当⼀个结构包含两个位段,第⼆个位段成员⽐较⼤,⽆法容纳于第⼀个位段剩余的位时,是舍弃 剩余的位还是利⽤,这是不确定的。总结(优点): 跟结构相⽐,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。3.结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的 整数倍。

2024-11-06 23:14:54 769

原创 数据在内存中的存储

存储规律 同理short也可以推 signed int 和unsigned int 无太大用重要的是如何看待(就是打印时用的是%d %u)c语言中 char的符号不确定 大部分为signed char %d 打印有符号数 %u打印无符号数 而且打印时会发生整型提升。例子 10进制5.5 2进制 5.5==101.1 要看每一位的权重 S = 0 M = 1.011 E=2;关键为*(char*)&a的值 (char)a是不对的 因为拿的字节不一定为最低位的。1. 整数在内存中的存储。

2024-11-04 22:33:24 320

原创 c语言内存函数

但用vs库里面memcpy能实现这种重叠(相当于vs里面memcpy的功能实现的跟memove一样)这是一种特里。例如把arr1的内容拷贝到arr1中(可能会出现重叠)memcpy(arr1+2,arr1,20);注意对于重叠的内存,交给memmove来处理(memcpy函数不负责重叠内存的拷贝)1. memcpy使⽤和模拟实现--内存拷贝 任何类型都可以拷贝。2. memmove使⽤和模拟实现--内存移动。3. memset函数的使⽤--内存设置。mem-memory--记忆--内存。

2024-11-02 22:50:23 205

空空如也

空空如也

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

TA关注的人

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