自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C/C++内存管理【C++】

/ 例如 链表_val = 0;int _val;//构造,_val(val){}int main()//new操作符 在为自定义类型申请空间时,会去调用构造函数//如果new失败了后抛异常,不需要手动检查//delete操作符 会去调用析构函数return 0;在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。

2024-03-08 19:04:55 964 3

原创 类和对象 02【C++】

初始化列表:构造函数中用于初始化成员变量的特殊语法。explicit阻止隐式类型转换。static成员为类共享的数据或函数。友元机制突破封装,友元函数/类可访问私有/保护成员。内部函数是类内的嵌套函数。匿名对象常用于初始化或返回值场景。拷贝对象时,编译器进行如深拷贝、RAII等优化。

2024-03-08 07:49:08 961 1

原创 类和对象 01【C++】

在C++中,我们使用关键字 class 来定义类。类可以包含数据成员(变量)和成员函数(方法)。对象是类的实例。要创建一个对象,你需要使用类的名称,后面跟着一个或多个参数(如果有构造函数的话)。

2024-02-21 21:59:41 947 3

原创 初识cpp【C++】

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{ }即可,{ }中即为命名空间的成员。命名空间解决了C语言中的命名冲突问题例如:出现命名冲突的原因:当然,在引入在第三方库时,C语言也容易出现重定义现象;解决方法:将命名冲突的变量放到命名空间域中上图中 namespace lisi 中的 lisi 是 命名空间的名字命名空间中可以定义变量/函数/类型命名空间可以嵌套同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

2024-02-21 10:29:09 779

原创 排序【数据结构】

排序是将一组数据按照一定的顺序排列的过程。常见的排序算法有很多种,包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。不同的排序算法有不同的优缺点,适用于不同的场景和数据类型。

2024-01-29 22:11:05 1103 4

原创 堆和堆排序【数据结构】

堆(Heap)是一种数据结构,它是 **一种特殊的二叉树** ,其中父节点的键值总是大于或等于(或小于或等于)其任何一个子节点的键值。这意味着在堆中,根节点具有最大(或最小)键值。

2024-01-29 11:50:13 1421 27

原创 二叉树【数据结构】

由一个根结点和两棵互不相交、分别称为根结点的左右子树的二叉树组成每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点左右子树是有顺序的不能颠倒空二叉树只有一个根结点根节点只有左子树根结点只有左子树根结点既有左子树又有右子树满二叉树: 在一棵二叉树中,所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上叶子结点只能出现在最下一层分叶子结点的度一定是2在相同深度的二叉树中,满二叉树的结点个数最多,叶子树最多完全二叉树。

2023-12-19 15:14:00 1819 38

原创 求最大公约数的几种常见的方法 【详解】

这里比较推荐是用 辗转相除法(欧几里得算法)和 《九章算术》中的 更相减损法多说一下,因为当时阿明浅浅学过遍辗转相除法,然后不久后就忘干净了,用的时候还要再去反复找,为了方便使用,干脆把 求解最大公约数 的几种常见的方法详细介绍一下,虽然不是最好,但是多少希望对大家有些帮助!希望大家对这些方法,有更加深刻的印象。加油!!!

2023-10-19 21:02:39 6209 40

原创 Leetcode: 203. 移除链表元素

这里free(cur) 会把第一个结点的内存空间释放返回给操作系统,pre->next = next;即此时的 pre 是NULL ,cur指向的是head(第一个结点),删去结点(free(cur))。先让cur指向第一个结点,遍历结点,把不等于val的值给放到新的链表里。这样的话就要考虑如何找被删除元素的前一个结点,和被删除元素的下一个结点。因为 要删除的元素可能不仅仅是一个,也有可能是多个。前提是:删去的不是第一个结点的情况下。遍历链表,删除指定元素(val)给你一个链表的头节点。

2023-12-19 15:22:13 3332 41

原创 带头结点的双向循环链表

/存放后面结点的指针//存放前面结点的指针}ListNode;

2023-12-01 19:40:26 1831 67

原创 常见基础指令【Linux】

一个文件的ACM时间是:A(Access)文件最近一次被访问的时间;先使用head 读取3010行的内容,再把读取的内容,使用tail 读取3010行中的后10行。绝对路径是指文件或目录的完整路径,包括从根目录(/)开始一直到该文件或目录的路径。需要注意的是:当文件有数据时,先清空,再把hello 放到test.txt里面。上述指令意思是:将hello 输出重定向到test.txt文件中。相对路径是指文件或目录相对于当前工作目录的路径(./)。cp [选项] 源文件或目录 目标文件或目录。

2023-12-01 19:37:31 242 8

原创 栈和队列【详解】

栈:仅限在一端进行插入和删除元素操作。数据插入删除的一端称为栈顶,而另一端称为栈底。数据的插入操作。数据的删除操作。栈中的数据遵循后进先出,简称LIFO)的原则。栈的存储定义这里采用的是顺序栈,以动态数组的形式进行存放栈的元素,当栈满时,可以动态的增加栈的容量。定义一个指针负责指向动态数组,用top来表示栈底,还有就是栈的容量capacity。int top;//栈底//栈的容量}Stack;2.栈的初始化当栈的存储定义完成后,就开始对栈进行初始化。//初始化栈。

2023-11-22 16:31:34 910 61

原创 Leetcode:622. 设计循环队列 题解【具详细】

首先我们需要定义出一个循环队列的存储定义,这里采用的是使用动态数组来进行模拟循环队列,根据题中给出的接口返回类型,我们可以知道循环队列的数据类型为int。其次,还需定义两个记录数组的下标,一个记录队列的队头,另一个记录队列的队尾(也就是指向要入队的下一个元素的位置)。另外还要提供一个表示要存储数据的具体个数。如图:

2023-11-22 16:25:05 608 2

原创 单链表(增删改查)【超详细】

单链表的存储与顺序表的存储不一样,单链表不仅仅存放数值,还要存放下一个结点的地址代码//存放单链表的值//存放下一个单链表的地址}SLNode;当有了单链表的存储定义,我们就可以对单链表进行存放结点。

2023-11-10 16:05:51 3062 59

原创 Leetcode:876. 链表的中间结点 【详解】

head难度:简单由题目可以知道,题目要求返回中间的结点。

2023-11-10 15:53:21 124 6

原创 【数据结构】顺序表

存储单元依次存储。

2023-10-30 20:39:30 2174 65

原创 【时间复杂度和空间复杂度】

首先介绍一下算法(Algorithm)算法是对特定问题求解步骤的一种描述。一个“好”的算法应该达到以下目标:正确性、可读性、健壮性、高效率与低存储量需求算法的效率的度量 是通过时间复杂度和空间复杂度来描述的。

2023-10-30 20:35:06 131 9

原创 Leetcode:【189. 轮转数组】

给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数难度:中等向右轮转 1 步:向右轮转 2 步:向右轮转 3 步:向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100]

2023-10-24 20:55:45 271 27

原创 程序环境、预处理和宏

注意:预定义符号都是语言内置的__FILE__ 进行编译的源文件__LINE__ 文件当前行号__DATE__ 文件被编译的日期__TIME__ 文件被编译的时间__STDC__ 如果编译器遵循ANSI C,其值为1,否则未定义例如int main()int a = 0;return 0;例如注意 #define MAX 6 后面最好不要加分号,容易出错。

2023-10-19 16:40:11 220 51

原创 文件操作【详解】

平时我们说的硬盘上的文件就文件当然在程序设计中,我们一般说到的文件有两种:程序文件、数据文件(从文件功能上来看)。1.程序文件源程序文件 (后缀 .c)目标文件(.obj)可执行程序(.exe)2.数据文件程序运行时读写的数据,需要输入输出的文件3. 文件名文件名包含三部分: 文件路径+文件名主干+文件后缀例如 d:\code\test.txt。

2023-10-09 19:42:24 739 54

原创 超级圣诞树(BC115) 【题解】超详细

前言这个题看了很久,没想出来,然后看了一些大佬的题解(可能是我的理解能力有些慢),中途有很多次放弃的想法,但是最终坚持着 ,研究明白了。所以想结合我的想法更加具体分享一下。

2023-10-09 19:40:25 1332 58

原创 动态内存管理

有时我们使用malloc和calloc函数进行动态内存分配的时候,我们发现所分配的空间已经固定下来,那木我们就会想 会不会有一种可以调整动态内存大小的动态分配的内存函数呢?所使用的内存就是栈内存,函数执行时自动分配内存,函数退出时自动释放内存。栈内存的特点是速度快,但分配的内存大小有限,可能会导致栈溢出。但是如果只是这样,有时候我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了。如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给。

2023-10-01 21:15:29 509 78

原创 Leetcode:【485. 最大连续 1 的个数】

在二进制数组中,元素只有 0 和 1 ,返回得是连续1最多得个数,此时回想到 用一个变量来记录每一次得连续1的个数(count_1),再用另一个变量(max1)来记录其中连续1个数中 的最大的数。开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3., 计算其中最大连续。

2023-09-26 11:14:20 387 24

原创 【C语言】通讯录

在通讯录中,我们一般保存联系人的信息,联系人的信息一般会有 姓名、年龄、性别、电话、地址等。在通讯录中,我们也会对一些信息进行增删改查。在这里我们发现switch 语句中 的case 选项中的常量表达式 是字母,这里主要是利用了枚举常量。这里采用的思想是 数组后面的元素前移将前面的元素覆盖来达到删除该信息的目的。上述是增加联系人的信息,既然增加联系人我们就来查看联系人信息。功能实现的前提是 先对通讯录 进行设计 并 初始化。contact.c 用于主要代码的功能实现。这里是直接调用的初始化通讯录函数。

2023-09-26 11:13:31 1003 58

原创 MT1184矩形相交 题解【超详细】

输入2个矩形的左上角和右下角两个点的坐标值(x,y),判断2个矩形是否相交,输出YES或者NO。矩形的边应与x,y轴相平行。假定输入坐标能顺利构成矩形,不考虑无效矩形的况难度:白银输入格式:输入整型,空格分隔。每行输入一组信息。输出格式:输出YES或者NO输入:输出:NO备注:特殊情况考虑:在数学中,两个图形相交是指它们有公共的部分,或者说同时属于两者的点的集合不是空集。若两个几何图形在某个地方有且只有一个交点,则可以称为相切而不是相交。

2023-09-22 18:39:37 386 70

原创 【C语言】自定义类型:结构体【结构体内存具详细】,枚举,联合

(1)声明类型的同时定义变量p1//结构体变量的定义和初始化int x;int y;}p1;//声明类型的同时定义变量p1(2)初始化,定义变量的同时赋值struct Stuint age;(3)结构体嵌套初始化struct Stuint data;//结构体嵌套初始化枚举就是列举enum ColorRED,GREEN,BLUEenum SexMALE,FEMALE,SECRET。

2023-09-19 14:31:34 901 84

原创 Leetcode: 645.错误的集合 题解【超详细】

在这里求的缺失的元素是,简单思路就是 可以用一个临时数组(数组中的全部元素置0)来 把[ 1, n ] 这些数组元素存放到相应的数组中(就是与相应的数组下标与之对应)【例如】 元素 1 ,存放到临时数组 下标 1 中;题目是要求我们返回数组的(即一个重复的元素,一个缺失的元素)。然后在 numsSize大小的数组中进行遍历 其中那个元素为零(因为只有1个元素是缺失的)就是缺失的数组。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合。这里用的就是两层for循环,

2023-09-16 09:46:43 834 60

原创 【C语言】字符函数和字符串函数

(1)函数头部size_tstrlen(constcharstring(2)注意事项字符串以 '\0'作为结束标志,strlen函数返回的是在字符串'\0'前面出现的字符的个数(不含\0)参数指向的字符串必须要以\0结束函数的返回值是类型是 size_t 这是无符号整型(易错)(3)strlen的使用int main()//获取字符串的长度return 0;(4)strlen的模拟实现//普通实现count++;

2023-09-11 14:24:57 1269 69

原创 Leetcode:【169. 多数元素】

那就大混战呗,最差所有人都联合起来对付你(对应你每次选择作为计数器的数都是众数),或者其他国家也会相互攻击(会选择其他数作为计数器的数),但是只要你们不要内斗,最后肯定你赢。其实可以 在nums数组中 元素可以这样区分 友军(相同元素),敌军(不同元素)。尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。这里采用的 进阶的做法(时间复杂度为 O(n)、空间复杂度为 O(1) )你可以假设数组是非空的,并且给定的数组总是存在多数元素。,返回其中的多数元素。简单地介绍一下摩尔投票法。

2023-09-07 16:35:57 730 41

原创 Leetcode:349. 两个数组的交集【题解超详细】

下方代码的方法就是 用两层for循环来比较nums1和nums2两个数组中相同的元素,然后把相同的元素,通过创建一个临时数组,存放与下标与之对应的元素 ( 前提是先把来临时数组需要用到元素初始化为-1 ,原因是方便以后的数组遍历)。接着用两层for循环进行判断两个数组是否相同的元素(即数组元素的交集),在内层的for循环里面使用一个if语句进行判断,如果找到两个数组元素的交集我们就先把元素放到临时数组(tmp[])相应的位置。接着就是返回 返回数组的元素的个数 和 返回 返回数组首元素的地址。

2023-09-04 08:52:05 1971 64

原创 Leetcode: 1. 两数之和 【题解超详细】

第一层循环 就是从数组的下标 0 开始 (即第一个元素开始 与 第二层的for的循环的第二个元素进行相加 来判断 是否等于目标值 ) 找到 两个数的下标 相加后等于目标值 注意返回数组的大小 ,还有就是返回数组。第一层for循环我们就是 按照数组下标进行来 [0, numsSize-1] 其实就是遍历 numsSize个元素, i的取值范围就是 [ 0 , numsSize-1 ] 这样就可以进行遍历整个数组的元素。这样自就可以让 第一个元素 开始 依次和后面的元素相加进行判断。

2023-09-01 18:09:46 1981 50

原创 Leetcode:【448. 找到所有数组中消失的数字】题解

题目意思是再在有 n 个元素的数组中,找出[1,n]中没有出现的数组,其中 n 个元素中,可能会出现重复的元素,于是 我们就可以 再次创建一个临时数组tmp(每个元素置0),存放相应的元素来取消重复的元素。然后遍历整个数组,如果元素为零,则为没有出现在nums中的数字。这里的arr数组用于返回数组,tmp 临时数组主要用来消除重复的元素,主要思路。通过对循环每一个数组元素,对其进行取模运算,再将其放入对应的下标的数组中。开始遍历数组,找出[1,n] 中没有出现在nums数组中的数字。

2023-08-30 07:47:22 1122 51

原创 Leetcode:238. 除自身以外数组的乘积【题解超详细】

由于该题不能使用除法 所以参考题解写一个左右乘积列表的方法 创建两个新的数组a,b 一个用于记录从左到右的乘积(类似于动态规划的思想)a 另一个记录从右到左的乘积 b(注意b是从右到左进行累乘) 而a的最左端为1,b的最右端为1 如此在结尾的时候只需要a*b即可 举例, ans[0]=a[0]*b[0] a[0]=1 b[0]=除了nums[0]以外所有元素的乘积。这里我们以数组 [1,2,3,4] , 这里我们需要注意的是 数组的第一个元素的前缀乘积和数组的最后一个元素的后缀乘积是1。

2023-08-27 09:13:04 1990 51

原创 【JZ65 不用加减乘除做加法】题解

根据题目,不能使用 + - * / 来进行来两个数的加法,这时我们可能就会想到 &,|,^ 这些位操作符。先让num1 为数值位,num2为进位位,while(进位位),当不在进位时,即计算完(num2 为0)在循环中,我们先 用 num1 与 num2 进行 异或运算 (相同为 0 ,不同为1)得到当前数值位。再 num1与num2 进行 按位与,再左移1位,完成进位 计算。cpu里面的加法器(里面既有数值上的计算,又有进位上的计算)所以我们 在这里 也 实现 既有数值的计算也有进位的计算。

2023-08-25 15:03:28 175 15

原创 【C语言】指针 和 数组 笔试题详解

cpp[-2],这里的下标引用操作符的优先级高于*,先是cpp[-2],cpp[-2]相当于*(cpp-2),*(cpp-2)得到的是c+3,因为之前*cpp[-2]+3有一个解引用,所以*(c+3)得到字符串“FIRST”的首字符的地址,之后再+3则指向 S。这里ptr1[-1] 相当于 ptr1 -1, (int*)((int)a + 1);cpp[-1][-1]+1,首先确定cpp指向的是cp[2],然后cpp[-1][-1] +1相当于 * ( * (cpp-1) - 1) +1。

2023-08-23 23:14:16 602 42

原创 【C语言】指针的进阶

]的优先级 高于 * ,所以 要加上()来保证p 先和 * 结合。

2023-08-19 09:26:14 770 39

原创 【C语言】调试技巧

我们平时会口头说 bug ,报错,waring(报警)等,bug 英文的意思是虫子,然而在计算机发展史上的第一只 Bug ,真的是因为一只飞蛾意外走入一电脑而引致故障,因此Bug从原意为臭虫引申为程序错误。当我们这个时候就需要我们的调试 来开启新大陆关于程序错误的参考资料。

2023-08-15 22:24:49 874 34

原创 【C语言】结构体详解

结构体类型 是一种 构造类型,它是由若干成员组成的,每个成员可以是一个基本数据类型或者是一个构造类型。结构体类型的名字 是由一个关键字 struct 和 结构体名 组成的结构体定义的一般形式:struct 结构体类型名类型说明符1 成员名1;类型说明符2 成员名2;int ID;typedef 类型重命名struct 是结构体关键字,不能省略。结构体类型名可以省略,称为无名结构体。结构体成员可以是任何基本数据类型,也可以是数组和指针类型。

2023-08-12 16:28:10 908 14

原创 【C语言】初阶指针详解

说到指针,那么我们还要了解一下内存,内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,

2023-08-10 23:14:19 247 9

原创 【C语言】操作符详解

如果 算术右移与 逻辑右移 总是分不清。

2023-08-09 20:25:24 651 26

空空如也

空空如也

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

TA关注的人

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