- 博客(75)
- 收藏
- 关注
原创 【C语言干货】一维数组传参本质
提示:以下是本篇文章正文内容,下面案例可供参考效率考虑:如果每次传递数组都要拷贝整个数组,对于大数组会非常低效历史原因:C语言设计之初就注重效率和接近硬件的特性灵活性:可以传递数组的一部分(如arr+5传递第6个元素开始的子数组)
2025-05-08 18:55:31
193
原创 【C语言】(8)—指针2
指针本质上是一个变量,其存储的是内存地址。通过指针,我们可以直接访问和操作内存中的数据,这赋予了C语言极高的灵活性和效率。这里p是一个指针变量,它存储的是变量a的内存地址。输出结果将显示&arr[0]和arr的值相同,证明数组名确实是首元素地址。sizeof(数组名):此时数组名表示整个数组,计算的是整个数组的大小。数组作为函数参数传递时,实际上传递的是数组首元素的地址,而非整个数组。数组名在大多数情况下代表数组首元素的地址,但有两个重要的例外情况。&数组名:此时取到的是整个数组的地址。
2025-05-08 18:55:03
346
原创 【C语言干货】野指针
提示:以下是本篇文章正文内容,下面案例可供参考野指针是指向"无效内存区域"的指针。这些指针可能指向:已经释放的内存未初始化的随机地址超出合法范围的地址使用野指针就像在现实生活中使用一个错误的地址去寄信——你无法预测信会送到哪里,甚至可能造成严重的后果。
2025-05-06 17:34:32
408
原创 【C语言】(7)—指针1
计算机内存可以想象成一栋巨大的宿舍楼,每个房间(内存单元)都有一个唯一的编号(地址)。CPU通过这个地址来访问特定的内存空间。地址通常用十六进制表示(如0x006FFD70)内存单元的编号 == 地址 == 指针。指针-指针:计算两个指针之间的元素个数。每个内存单元大小为1字节(8位)指针±整数:根据类型决定步长。指针关系运算:比较指针位置。每个内存单元都有唯一地址。
2025-05-06 17:34:18
276
原创 C语言(5)—函数
可以接收输入参数(也可以没有)可以返回一个值(也可以不返回)可以被多次调用实现了代码的复用和模块化返回类型 函数名(参数列表) {// 函数体return 返回值;// 返回1表示闰年,0表示非闰年return 1;int year;printf("请输入年份: ");printf("%d年是闰年\n", year);elseprintf("%d年不是闰年\n", year);return 0;函数的基本概念和分类库函数的使用方法。
2025-04-29 16:00:00
420
原创 C语言(6)—函数递归
递归(Recursion)是指在函数的定义中调用函数自身的方法。简单来说,就是"自己调用自己"。printf("递归调用\n");// 函数调用自身return 0;递归的基本概念和实现方法经典递归问题的解决方案(阶乘、斐波那契数列等)递归与迭代的对比分析递归的底层机制和优化技巧实际应用中的注意事项掌握递归需要大量的练习和实践。建议从简单问题入手,逐步尝试解决更复杂的递归问题,同时注意理解递归调用过程和性能特点。
2025-04-29 16:00:00
257
原创 【C语言项目实践】扫雷游戏—课程设计&&附加代码
1.游戏区域由若干方格组成的矩形网格2.部分方格随机布置有地雷3.玩家点击方格(输入坐标)来"揭开"方格4.如果揭开的是地雷,游戏失败5.如果不是地雷,则显示周围8个方格中的地雷数量6.玩家需要根据数字提示,推理出所有地雷的位置。
2025-04-29 16:00:00
991
原创 C语言(5)—操作符详解
赋值操作符:=, +=, -=, *=, /=, %=, <<=, >>=, &=, |=, ^=, ++, --, &, *, +, -, ~, sizeof, (类型)关系操作符:>, >=, <, <=, ==,!十六进制:基数为16,数字0-9和A-F(前缀0x)原码:最高位表示符号(0正1负),其余位表示数值。算术操作符:+, -, *, /, %八进制:基数为8,数字0-7(前缀0)& (按位与):两位都为1时结果为1。| (按位或):任一位为1时结果为1。位操作符:&, |, ^, ~
2025-04-28 21:00:00
379
原创 C语言(4)—数组
可以存放一个或多个数据,但元素个数不能为0所有元素的类型必须相同数组元素在内存中是连续存储的数组分为一维数组和多维数组,其中二维数组是最常见的多维数组形式。数组是C语言中组织和处理大量数据的强大工具。一维数组的创建、初始化、使用和内存布局二维数组的概念和使用方法变长数组的概念和限制数组的实际应用案例(字符动画、二分查找)使用数组时的注意事项掌握数组的知识对于C语言编程至关重要,它是学习更复杂数据结构(如字符串、结构体等)的基础。
2025-04-28 18:30:00
420
原创 C语言(3)—分支和循环
分支和循环是C语言编程的基础,掌握它们对编写高效、清晰的代码至关重要。各种分支结构(if、if-else、switch)的使用场景和注意事项三种循环结构(while、for、do-while)的特点和适用情况循环控制语句(break、continue)的正确使用关系与逻辑运算符的运用技巧通过大量实例代码,希望您能深入理解这些概念,并在实际编程中灵活运用。记住,良好的代码结构和适当的注释同样重要,这能使您的代码更易读、易维护。尝试用不同循环结构实现相同功能,比较优缺点。
2025-04-27 18:13:51
492
原创 【C语言干货】结构体成员访问
提示:以下是本篇文章正文内容,下面案例可供参考提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
2025-04-25 16:45:00
348
原创 【C/C++干货】VS Code 快捷键大全
Visual Studio Code (VS Code) 作为目前最受欢迎的代码编辑器之一,其强大的快捷键系统可以极大提升开发效率。本文将全面介绍 VS Code 的快捷键使用技巧,帮助您成为更高效的开发者。
2025-04-24 16:22:38
340
原创 【C语言干货】面试 | 不使用临时变量实现两个整数的交换
这一步将新的 a(即 a^b)和新的 b(即原来的 a)进行异或运算,结果存储在 a 中。这一步将 a 和 b 进行异或运算,结果存储在 a 中。此时,a 包含了 a 和 b 的异或结果。这一步将新的 a(即 a^b)和原来的 b 进行异或运算,结果存储在 b 中。b 等于 a,所以 b 现在等于原来的 a。a 等于 b,所以 a 现在等于原来的 b。结合律:(a ^ b) ^ b = a。交换律:a ^ b ^ b = a。第一步:a = a ^ b;第三步:a = a ^ b;
2025-04-24 16:21:20
452
原创 【C语言干货】结构体成员访问
在C语言中,结构体是一种常用的数据类型,它允许我们将多个变量组合成一个单一的数据类型。访问结构体成员可以通过直接访问和间接访问两种方式实现。这两种访问方式在不同的场景下各有优势。本文将详细探讨这两种访问方式的区别,并提供示例代码。间接访问是指通过指向结构体的指针来访问结构体成员。这种方式在需要通过指针操作结构体时非常有用,例如在函数中传递结构体参数时。直接访问是指直接通过结构体变量名和点操作符(.)来访问结构体成员。这种方式简单直观,适用于直接操作结构体变量的场景。
2025-04-23 19:59:32
422
原创 【C语言】(1)—C语言常见概念
C语言是一种通用的、过程式的计算机编程语言,广泛应用于系统软件开发(如操作系统、编译器)和嵌入式系统开发。作为人与计算机交流的媒介,它与自然语言(如汉语、英语)类似,但具有严格的语法规则。特点:高效性:直接操作内存,执行效率高可移植性:代码可在多种平台上编译运行结构化:支持函数和模块化设计。
2025-04-23 19:53:51
432
原创 C++(23)—模板初阶
类模板允许定义与类型无关的通用类,常用于容器类(如动态数组、栈、队列)。**示例:**通用栈类public:private:T* _array;// 成员函数类外定义// 简化的实现(实际需处理扩容)
2025-04-20 16:00:00
674
原创 滑动窗口(8)—最⼩覆盖⼦串
我们可以用滑动窗口的思想解决这个问题。在滑动窗口类型的问题中都会有两个指针,一个用于「延伸」现有窗口的 r 指针,和一个用于「收缩」窗口的 l 指针。在任意时刻,只有一个指针运动,而另一个保持静止。我们在 s 上滑动窗口,通过移动 r 指针不断扩张窗口。当窗口包含 t 全部所需的字符后,如果能收缩,我们就收缩窗口直到得到最小窗口。本问题要求我们返回字符串 s 中包含字符串 t 的全部字符的最小窗口。我们称包含 t 的全部字母的窗口为「可行」窗口。
2025-04-20 15:30:00
306
原创 C++(22)—内存管理
*核心优势:**自动调用构造函数和析构函数class A {public:private:int _a;// 调用构造函数delete p1;// 调用析构函数// 调用3次构造函数// 调用3次析构函数return 0;C++内存管理优势:通过new/delete实现类型安全、自动构造/析构调用。底层机制:依赖operator new/delete实现,本质仍基于malloc/free。适用场景:优先使用new/delete,仅在需要与C代码交互时使用malloc/free。
2025-04-17 16:26:09
585
原创 滑动窗口(7)—串联所有单词的⼦串
初始化 differ 时,出现在窗口中的单词,每出现一次,相应的值增加 1,出现在 words 中的单词,每出现一次,相应的值减少 1。窗口移动时,若出现 differ 中值不为 0 的键的数量为 0,则表示这个窗口中的单词频次和 words 中单词频次相同,窗口的左端点是一个待求的起始位置。记 words 的长度为 m,words 中每个单词的长度为 n,s 的长度为 ls。这样的划分方法有 n 种,即先删去前 i (i=0∼n−1)个字母后,将剩下的字母进行划分,如果末尾有不到 n 个字母也删去。
2025-04-17 16:25:47
357
原创 滑动窗口(6)—找到字符串中所有字⺟异位词
根据题目要求,我们需要在字符串 s 寻找字符串 p 的异位词。因为字符串 p 的异位词的长度一定与字符串 p 的长度相同,所以我们可以在字符串 s 中构造一个长度为与字符串 p 的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;当窗口中每种字母的数量与字符串 p 中每种字母的数量相同时,则说明当前窗口为字符串 p 的异位词。在算法的实现中,我们可以使用数组来存储字符串 p 和滑动窗口中每种字母的数量。
2025-04-15 11:13:52
481
原创 滑动窗口(5)—⽔果成篮
我们可以使用滑动窗口解决本题,left 和 right 分别表示满足要求的窗口的左右边界,同时我们使用哈希表存储这个窗口内的数以及出现的次数。如果此时哈希表不满足要求(即哈希表中出现超过两个键值对),那么我们需要不断移动 left,并将 fruits[left] 从哈希表中移除,直到哈希表满足要求为止。需要注意的是,将 fruits[left] 从哈希表中移除后,如果 fruits[left] 在哈希表中的出现次数减少为 0,需要将对应的键值对从哈希表中移除。
2025-04-13 18:17:53
243
原创 C++(21)—类和对象(下) ⑥匿名对象
匿名对象(Anonymous Object)是C++中一种特殊的对象创建方式,通过类型名直接调用构造函数生成对象,且不赋予对象名称。匿名对象通过类名(参数)直接创建,无需命名,生命周期仅限当前行。适用于临时调用方法或传递参数,简化代码并减少作用域污染。注意避免悬垂引用,合理利用其特性提升代码简洁性。**最终建议:**在需要“一次性”使用对象的场景下优先使用匿名对象,但需谨慎管理其生命周期!
2025-04-13 18:15:38
793
原创 滑动窗口(4)—将x减到0的最⼩操作数
遍历数组 nums,对于每个元素 nums[i],我们先将 nums[i] 加到前缀和 s 上,如果哈希表中不存在 s,则将其加入哈希表,其值为当前下标 i。然后我们判断 s−x 是否在哈希表中,如果存在,则说明存在一个下标 j,使得 nums[j+1,…i] 的和为 x,此时我们更新答案的最小值,即 ans=min(ans,n−(i−j))。我们可以将问题转换为求中间连续子数组的最大长度,使得子数组的和为 x=sum(nums)−x。遍历结束,如果找不到满足条件的子数组,返回 −1,否则返回 ans。
2025-04-13 18:14:58
280
原创 C++(20)—类和对象(下) ⑤内部类
内部类(Nested Class)是指定义在另一个类内部的类。它与外部类的关系类似于“容器”与“内容”,但内部类本身是一个完全独立的类,仅受外部类的作用域和访问限定符限制。内部类是C++中一种强大的封装工具,通过默认友元关系和访问权限控制,能够实现高内聚的类设计。增强代码可读性和组织性;隐藏实现细节,提升封装性;替代友元类,简化协作逻辑。然而,内部类的滥用可能导致代码结构复杂化。开发者应在封装需求与代码简洁性之间找到平衡,遵循“最小暴露原则”,让内部类真正成为提升代码质量的利器。
2025-04-11 16:00:54
425
原创 滑动窗口(3)—无重复字符的最长子串
在上面的流程中,我们还需要使用一种数据结构来判断 是否有重复的字符,常用的数据结构为哈希集合(即 C++ 中的 std::unordered_set,Java 中的 HashSet,Python 中的 set, JavaScript 中的 Set)。在每一步的操作中,我们会将左指针向右移动一格,表示 我们开始枚举下一个字符作为起始位置,然后我们可以不断地向右移动右指针,但需要保证这两个指针对应的子串中没有重复的字符。在移动结束后,这个子串就对应着 以左指针开始的,不包含重复字符的最长子串。
2025-04-11 15:59:51
428
原创 双指针(7)—盛最多水的容器
分治法、动态规划都用不上,要想得到 O(n) 的解法只有使用双指针一条路。即使看了答案知道了双指针解法,你也可能并不清楚这个解法为什么正确。如果没有真正理解题目,即使一次对着答案做出来了,再次遇到这个题目,还是可能做不出来。要理解这道题的正确性和原理,需要从背后的 缩减搜索空间 的思想去考虑题解。容器容积的计算⽅式:设两指针i, j,分别指向⽔槽板的最左端以及最右端,此时容器的宽度为容器的⾼度由两板中的短板决定,因此可得容积公式:j - i。枚举出能构成的所有容器,找出其中容积最⼤的值。
2025-04-10 16:00:00
330
原创 双指针(8)—有效三⻆形的个数
可以发现,如果我们固定 i,那么随着 j 的递增,不等式右侧 nums[i]+nums[j] 也是递增的,因此 k i,j也是递增的。当 i 固定时,我们使用双指针同时维护 j 和 k,它们的初始值均为 i;我们每一次将 j 向右移动一个位置,即 j←j+1,并尝试不断向右移动 k,使得 k 是最大的满足 nums[k]<nums[i]+nums[j] 的下标。我们将当 a=nums[i],b=nums[j] 时,最大的满足 nums[k]<nums[i]+nums[j] 的下标 k 记为 k i,j。
2025-04-10 15:00:00
430
原创 滑动窗口(2)—最⼤连续1的个数III
这样一来,我们就可以使用滑动窗口来实时地维护 left 和 right 了。在 right 向右移动的过程中,我们同步移动 left,直到 left 为首个(即最小的)满足 (1) 式的位置,此时我们就可以使用此区间对答案进行更新了。我们继续观察 (1) 式,由于前缀和数组 P 是单调递增的,那么 (1) 式的右侧 P[right]−k 同样也是单调递增的。随着 right 的增大,满足 (1) 式的最小的 left 值是单调递增的。
2025-04-09 18:24:10
169
原创 C++(19)—类和对象(下) ④友元
友元机制是C++中一把双刃剑,既能在特定场景下提供极大的灵活性,也可能因滥用导致代码维护困难。开发者需在封装性与灵活性之间谨慎权衡,遵循“最少使用”原则。正确使用友元,可以优化设计模式(如工厂模式、代理模式),但切记:封装为王,友元为辅助。
2025-04-09 18:17:37
605
原创 双指针(6)—快乐数
⽽「快慢指针」有⼀个特性,就是在⼀个圆圈中,快指针总是会追上慢指针的,也就是说他们总会。根据上述的题⽬分析,我们可以知道,当重复执⾏。,那么这个数⼀定是快乐数;的时候,数据会陷⼊到⼀个「循环」之中。的话,那么就不是快乐数。
2025-04-09 18:17:02
277
原创 C++(18)—类和对象(下) ③static成员
声明:在类内用static关键字声明。初始化:必须在类外单独初始化,且不带static关键字。class A {private:// 类内声明// 类外初始化(必须!静态成员是C++中实现类级别数据共享和功能封装的重要工具。理解其初始化规则、访问限制及适用场景,能够帮助开发者编写出更高效、健壮的代码。合理使用静态成员,可以简化设计模式(如单例模式)的实现,提升程序的可维护性。
2025-04-07 18:58:29
533
原创 双指针(5)—复写零
但是「从后向前」复写的时候,我们需要找到「最后⼀个复写的数」,因此我们的⼤体流程分两。因此我们选择「从后往前」的复写策略。如果「从前向后」进⾏原地复写操作的话,由于。的出现会复写两次,导致没有复写的数「被覆。ii. 然后从后向前进⾏复写操作。i. 先找到最后⼀个复写的数;
2025-04-07 18:58:02
129
原创 C++(17)—类和对象(下) ②类型转换
在C++中,类型转换分为隐式转换和显式转换。其中,类类型与其他类型之间的转换主要通过构造函数实现,而explicit关键字则用于控制这种转换的隐式行为。在构造函数前添加explicit关键字,可阻止编译器进行隐式类型转换,强制要求显式调用构造函数。若类定义了以内置类型为参数的构造函数,则编译器支持将内置类型隐式转换为该类类型的对象。若类定义了以其他类类型为参数的构造函数,则支持该类类型对象的隐式转换。对于A aa1 = 1;
2025-03-31 11:42:31
243
原创 双指针(4)—移动零
右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针左边直到左指针处均为零。左指针左边均为非零数;
2025-03-31 11:42:00
173
原创 滑动窗口(1)—⻓度最⼩的⼦数组
每一轮迭代,将 nums[end] 加到 sum,如果 sum≥s,则更新子数组的最小长度(此时子数组的长度是 end−start+1),然后将 nums[start] 从 sum 中减去并将 start 右移,直到 sum<s,在此过程中同样更新子数组的最小长度。在每一轮迭代的最后,将 end 右移。定义两个指针 start 和 end 分别表示子数组(滑动窗口窗口)的开始位置和结束位置,维护变量 sum 存储子数组中的元素和(即从 nums[start] 到 nums[end] 的元素和)。
2025-03-27 18:00:00
638
原创 双指针(3)—四数之和
在确定第一个数之后,如果 nums[i]+nums[n−3]+nums[n−2]+nums[n−1]<target,说明此时剩下的三个数无论取什么值,四数之和一定小于 target,因此第一重循环直接进入下一轮,枚举 nums[i+1];在确定前两个数之后,如果 nums[i]+nums[j]+nums[n−2]+nums[n−1]<target,说明此时剩下的两个数无论取什么值,四数之和一定小于 target,因此第二重循环直接进入下一轮,枚举 nums[j+1]。
2025-03-25 19:45:38
808
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人