- 博客(32)
- 收藏
- 关注
原创 283. 移动零
摘要:题目要求将数组中的零元素移动到末尾,同时保持非零元素的相对顺序。解决方案采用双指针法:指针i遍历数组,指针j标记非零元素位置。当遇到非零元素时,若i≠j则交换元素,确保非零元素前移且最多交换一次。时间复杂度O(n),空间复杂度O(1)。示例输入[0,1,0,3,12]处理后输出[1,3,12,0,0]。该方法高效地实现了原地操作,避免了不必要的元素移动。
2025-08-22 20:50:58
269
原创 459. 重复的子字符串
摘要:本文探讨了如何判断一个字符串能否由其子串重复构成。提供了两种解决方案:(1)将字符串s与自身拼接后去掉首尾字符,若剩余部分包含原字符串s则返回true;(2)暴力枚举可能子串长度,检查重复子串是否能构成原字符串。方法一通过字符串匹配实现,时间复杂度约O(n²);方法二通过遍历验证子串重复性。两种方法均能有效解决问题,适用于长度≤10^4的字符串。示例验证了算法的正确性。
2025-08-20 16:47:28
327
原创 C语言变量的声明和定义有什么区别?
变量声明与定义的区别在于内存分配:声明(如extern int a)仅告知编译器变量存在但不分配内存,多用于头文件共享;定义(如int a=10)会分配内存且可初始化,全局变量只能定义一次。局部变量声明即定义。关键区别在于声明是"告知存在",定义是"创建实体"。可通过extern关键字区分,无extern的全局声明默认为定义。记忆要点:声明说"有",定义说"在这里建"。
2025-08-11 22:33:37
763
原创 242. 有效的字母异位词
本文介绍了一种判断两个字符串是否为字母异位词的方法。通过比较字符串长度,统计每个字母出现次数(s字符串加1,t字符串减1),最后检查统计结果是否为0来判断。该方法时间复杂度O(n),空间复杂度O(1),适用于仅包含小写字母的字符串比较。关键步骤包括:长度检查、字母计数、结果验证。
2025-08-10 22:41:06
385
原创 28. 找出字符串中第一个匹配项的下标
题目要求在一个主字符串haystack中查找子字符串needle首次出现的位置索引。若找到则返回起始下标,否则返回-1。示例1中"sad"在位置0和6出现,返回第一个匹配位置0;示例2中"leeto"未出现返回-1。注意字符串长度限制在10^4以内且均为小写字母。该问题考察字符串匹配算法实现。
2025-07-31 22:44:33
378
原创 389.找不同
摘要:给定两个字符串s和t,其中t由s随机重排后额外添加一个字母组成。要求找出被添加的字母。示例:s="abcd",t="abcde"输出"e"。解决方法可以通过统计字符出现次数或使用异或运算。关键点在于t比s多一个字符,且s和t仅包含小写字母。时间复杂度为O(n),空间复杂度为O(1)。
2025-07-29 23:35:50
93
原创 1768. 交替合并字符串
本文描述了一个字符串合并问题:给定两个字符串word1和word2,要求通过交替添加字母的方式合并它们。具体规则是:依次从两个字符串中各取一个字符交替拼接,当其中一个字符串较短时,将较长字符串剩余部分直接追加到结果末尾。示例展示了不同长度字符串的合并结果,如"abc"和"pqr"合并为"apbqcr"。该问题要求处理长度不超过100的小写字母字符串,确保合并后的字符串包含所有原始字符并保持交替顺序。
2025-07-29 23:32:07
230
原创 SPI通信协议
SPI是一种全双工同步串行通信接口,采用主从架构,支持多从设备。其核心引脚包括MISO(主入从出)、MOSI(主出从入)、SCK(时钟)和NSS(片选)。SPI通信本质上是主从设备间的数据交换,每次发送必然伴随接收。相比IIC(最高400KHz),SPI速率可达10MHz(部分芯片达42Mbps)。工作模式由时钟极性(CPOL)和相位(CPHA)决定,常见4种模式(0-3),需根据外设规格选择。
2025-07-28 23:02:06
951
原创 串口通信模块
摘要 串行接口(Serial Interface)是一种数据逐位顺序传输的通信方式,具有通信线路简单的特点。串口通信分为单工、半双工和全双工三种模式,分别适用于不同应用场景。关键参数包括波特率(传输速率)、数据字长(8/9位)、停止位(1-2位)和校验位(奇偶校验)。串口编程需要确定硬件引脚(如PA9、PA10)并配置相关参数。与并行通信相比,串行通信虽然传输速度较慢,但硬件实现更简单。编程时还需注意特殊模式配置,如半主机模式的使用。
2025-07-28 22:41:21
400
原创 21.预处理-头文件
C语言头文件(.h)用于存放多个源码文件共享的公共资源,包含全局变量声明、函数声明、宏定义、结构体定义等。使用时通过#include指令包含,自定义头文件用双引号"",系统头文件用尖括号<>。为避免重复包含,应采用条件编译格式:#ifndef _HEADNAME_H...#endif。编译时通过-I选项指定自定义头文件路径。头文件机制本质上是通过预处理器将内容复制到源文件中,提高了代码复用性和可维护性。
2025-07-27 23:29:51
491
原创 20.预处理-条件编译
本文介绍了C语言中无值宏定义和条件编译的用法。无值宏常用于条件编译判断,如#define BIG_ENDIAN。条件编译有三种形式:#if判断宏值真假,#ifdef/#ifndef判断宏是否定义。条件编译主要应用于:1)控制调试语句,通过编译选项-D启用;2)选择不同实现代码,如在大型项目中配置不同功能模块。文章通过网卡选择的示例展示了多路分支条件编译的实际应用。
2025-07-27 23:24:15
478
原创 19.预处理-宏定义
摘要:C语言预处理是在编译前进行的文本替换处理,以#开头的指令由预处理器执行。预处理指令包括#include、#define等。宏分为无参宏和带参宏,本质是文本替换,能提高代码可读性和执行效率。无参宏如#define PI 3.14直接替换;带参宏如#define MAX(a,b)需要谨慎使用括号避免副作用。宏支持符号粘贴(##)拼接标识符,但需注意使用规则。预处理是编译过程(预处理-编译-汇编-链接)的第一步,可通过gcc -E选项单独执行预处理。
2025-07-26 20:23:04
1207
原创 18.结构体尺寸
本文系统讲解了CPU字长、地址对齐与结构体内存布局等底层概念。首先阐明CPU字长决定了系统存取内存的数据单元大小(如32位系统以4字节为单元),进而解释了地址对齐原理:数据应尽量存储在一个单元内以避免性能损失。文章详细分析了变量的m值(对齐基数)计算方法,并介绍了GNU的attribute语法用于手动设置对齐属性。对于结构体,其M值由成员最大m值决定,并需通过填充字节保证整体对齐。最后探讨了跨平台移植问题,提出了固定成员m值和使用packed属性压实结构体两种解决方案。
2025-07-26 19:22:45
1183
原创 17.联合体与枚举
联合体(共用体)是一种特殊的数据类型,其成员共享同一块内存空间,使得在任何时刻只有一个成员有效。联合体的大小由最大成员决定,对其任一成员的赋值都会覆盖其他成员。联合体常作为结构体成员,用于表示互斥属性。枚举类型则用于定义一组受限的整型常量,提高代码可读性。C语言中枚举本质是整型,而C++中才实现其完整特性。联合体和枚举分别通过内存共享和常量命名机制,优化了程序的内存使用和可维护性。
2025-07-24 14:17:41
579
原创 16.结构体尺寸
本文系统阐述了CPU字长、地址对齐及结构体内存布局的相关概念。CPU字长决定了系统存取数据的基本单位(如32位系统以4字节为单元)。地址对齐要求数据存储位置满足特定倍数关系(m值),未对齐会导致性能下降或系统错误。结构体的M值由成员最大m值决定,影响其内存布局和填充规则。文章还探讨了数据可移植性问题,提出通过固定成员m值或使用packed属性来确保跨平台一致性。这些概念对理解系统内存管理和优化数据结构具有重要意义。
2025-07-24 14:08:13
933
原创 15.结构体
C语言结构体基础与应用摘要:结构体是C语言中一种自定义数据类型,用于将不同基础类型组合成具有现实意义的复合类型。文章介绍了结构体的定义方式(struct标签{成员列表})、两种初始化方法(普通初始化和指定成员初始化),重点讲解了成员引用(使用.操作符)、指针操作(通过->访问成员)以及结构体数组的使用。指定成员初始化的优势包括顺序无关性、部分初始化和良好的扩展性。全文通过代码示例展示了结构体的基本操作,为理解和使用这一重要的数据结构提供了清晰指导。
2025-07-23 19:31:30
765
原创 1.IIC通信协议详解
IIC总线是一种由飞利浦公司开发的串行通信总线,采用多主从架构。其核心引脚包括数据线SDA和时钟线SCL,通信过程通过起始/停止信号控制。IIC采用器件地址寻址机制,支持半双工通信,适用于控制场景而非大数据传输。通信时序要求严格,SCL高电平时SDA需保持稳定。实际应用中常采用软件模拟IIC实现,便于时序控制和引脚管理。典型工作流程包括起始信号、地址/数据传输、应答机制和停止信号,空闲状态下SDA和SCL保持高电平。
2025-07-23 19:13:57
1136
原创 14.存储期
C语言变量生命周期分为三种:自动存储期(栈变量)、静态存储期(全局/静态变量)和自定义存储期(堆变量)。自动变量在作用域内自动分配释放;静态变量与程序同生命周期,未初始化会自动置零;堆变量通过malloc/calloc申请、free释放,需手动管理。static修饰局部变量会转为静态存储,修饰全局变量则限制其文件作用域。堆内存用完必须释放,但free不会清零或改变指针内容。
2025-07-23 00:12:06
419
原创 13.作用域
C语言作用域详解:作用域指标识符的可见范围,包括函数声明作用域、局部作用域和全局作用域。局部变量在代码块内有效,全局变量可跨文件访问。嵌套作用域中,内层同名变量会临时遮蔽外层变量。static关键字有两种用法:限制全局变量/函数到文件作用域,或将局部变量存储到数据段而非栈内存。合理控制作用域能避免命名冲突,提高代码可维护性。
2025-07-22 14:15:39
463
原创 12.内存管理
本文介绍了C语言程序的内存布局,主要包括栈、堆、数据段和代码段四大区域。栈内存存储局部变量、函数参数等,具有自动分配和释放的特点;静态数据(全局变量和静态局部变量)存储在数据段,生命周期贯穿整个程序;代码段存放程序指令。重点阐述了堆内存的动态管理特性,包括使用malloc/calloc申请内存和free释放内存的注意事项。文章还区分了物理内存与虚拟内存的概念,指出所有进程的虚拟内存布局相同,便于系统管理。通过分析不同内存区域的特点,帮助开发者理解C语言内存管理机制。
2025-07-21 23:33:22
1219
原创 11.字符串函数
本文介绍了C语言中常用的字符串处理函数及其注意事项:1)strstr用于查找子串;2)strlen获取字符串长度;3)strtok分割字符串时会修改原字符串;4)strcat/strncat用于拼接字符串,后者更安全;5)strcpy/strncpy用于复制字符串,后者有边界检查;6)strcmp/strncmp比较字符串ASCII值;7)strchr/strrchr分别从左/右查找字符。重点强调了安全函数(strncat/strncpy)的使用以避免内存溢出,并提供了各函数的典型用法示例。
2025-07-21 23:15:15
620
原创 10.特殊函数
本文摘要:介绍了三种特殊函数类型及其应用。静态函数通过static关键字限定作用域,减少命名冲突。递归函数通过自我调用解决问题,需包含终止条件以避免无限递归,如阶乘、字符串翻转等应用。回调函数由接口提供方间接调用,典型应用如信号处理,通过约定接口实现模块解耦。三种函数类型各具特点,分别用于作用域控制、递归问题求解和模块间协作编程。
2025-07-19 17:30:20
576
原创 9.函数基础
C语言函数是模块化编程的核心单元,通过函数头(名称、参数、返回类型)和函数体实现功能封装。函数调用时实参与形参需类型匹配但内存独立,执行流程涉及上下文切换。局部变量存储在函数栈内存中,具有临时性和作用域限制。注意事项包括:避免返回局部变量地址、栈空间有限不宜分配大变量。典型函数示例展示了参数传递、返回值处理等关键用法,体现了C语言通过函数实现代码复用和逻辑封装的特点。
2025-07-19 17:24:15
1065
原创 8.指针-进阶
本文解析了C语言中指针的核心概念:1.指针由数据类型和变量名组成,不同指针的区别仅在于指向的数据类型不同;2.特殊指针包括char型指针(常用于字符串)、多级指针(指向指针的指针)、void型指针(需强制类型转换)、const型指针(限制修改)和函数指针(可简写调用);3.重点阐述了各种指针的声明语法和使用场景,如函数指针在调用时可省略取址和间接引用操作符。这些概念是理解C语言内存管理和函数调用的关键基础。
2025-07-18 15:01:51
667
原创 7.数组-进阶
本文探讨了C语言中数组的多重含义和特性。数组名在不同上下文中可能代表整个数组或其首元素地址,如在定义、sizeof运算或取址时表示整个数组,其他情况则为首元素地址。数组下标运算本质是指针运算的简写形式。字符串常量被视为匿名数组,遵循相同规则。还介绍了两种特殊数组:零长数组(用于结构体末尾实现可变长度数据)和变长数组(定义时使用变量指定长度,但长度固定后不可变)。变长数组不支持初始化。这些特性展示了C语言数组与指针的紧密联系及其灵活的内存管理方式。
2025-07-18 14:38:53
559
原创 6.指针-初阶
本文介绍了C语言中指针的基础知识,包括内存地址、指针概念、定义赋值、索引操作以及指针尺寸。重点讲解了野指针的危害及防范措施,以及空指针的安全使用方式。文章还涉及指针运算,说明指针加减法会导致地址上下移动若干个目标单位。内容涵盖了指针的核心概念和常见操作,为理解指针提供了系统性的基础知识框架。
2025-07-17 20:35:14
714
原创 5.C语言-数组
本文介绍了C语言中数组的基本概念和使用方法。数组是一组相同类型变量的连续存储空间,通过下标访问元素。文章详细讲解了一维数组、字符数组和多维数组的定义、初始化及引用方式,并剖析了数组定义的语法结构:由元素类型和数组名+元素个数两部分组成。其中,字符数组需注意字符串结束符'\0'的使用,多维数组则是元素为数组的数组。文章还通过示例说明了数组越界、部分初始化等常见问题,以及指针数组等复杂类型的定义方法。
2025-07-16 21:28:30
531
原创 4.运算符
本文系统介绍了C语言中的各类运算符及其用法。主要内容包括:1)算术运算符(+、-、*、/、%等)及其前后缀运算规则;2)关系运算符(>、<、==等)组成的布尔表达式;3)逻辑运算符(!、&&、||)及其短路特性;4)位运算符(~、&、|、^、<<、>>)的二进制位操作;5)特殊运算符如赋值、复合赋值、条件运算符(?:)等;6)sizeof和return运算符的特殊用法。文中还通过示例说明了运算符优先级和结合性的重要性,并提供了相关练习题。
2025-07-16 12:03:16
782
原创 3.数据类型-下
隐式转换示例代码不管是隐式转换,还是强制转换,变换的都是操作数在运算过程中的类型,是临时的,操作数本身的类型不会改变,也无法改变。
2025-07-14 20:15:04
633
原创 2.数据类型-上
计算机中存储的都是1和0,因此各种字符都必须被映射为某个数字才能存储到计算机中,这种映射关系形成的表称为 ASCII 码表。字符本质上就是一个单字节的整型,支持整型所有的运算。指出下列常量的类型。字符串的内部存储细节。
2025-07-14 18:19:25
918
原创 1.C语言程序入门
变量 a 有固定的大小,因此也有取值范围,典型的范围是:-2147483648到2147483647。int a 代表在内存中开辟一块小区域,称为 a ,用来存放整数,a 一般被称为变量。long long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长长整型。变量 a 所占内存大小,在不同的系统中是不一样的,64位系统典型的大小是4个字节。long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长整型。short:用来缩短整型变量的尺寸,减少取值范围并节省内存,称为短整型。
2025-07-14 17:51:57
340
原创 1.两数之和
本文详解LeetCode经典题目"两数之和"的C语言解法。题目要求在给定数组中找出和为目标值的两个元素下标。主要介绍两种解法:暴力枚举法(时间复杂度O(n²))和更优的哈希表法(时间复杂度O(n))。哈希表法通过存储元素及其下标,快速查找目标值补数,显著提升效率。文章比较了两种方法的时间/空间复杂度,强调哈希表法的优势。这道题既是算法基础训练,也涉及C语言的指针与内存管理,是面试常见题目。
2025-06-26 01:06:25
290
超声波测距仪的设计与制作
2025-07-26
好像没有下载那个3.97G的东西,如何解决?
2025-04-23
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅