自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux系统编程Day3-- Linux常用操作(续)

本文介绍了Linux系统中常用的文件操作命令:rm/rmdir用于删除文件/目录,其中rm -rf是强制删除的"危险命令";man命令用于查看命令手册;cp用于文件复制,支持递归和保留属性等选项;mv用于移动/重命名文件;cat用于查看/合并文件内容;less/more用于分页查看大文件;head/tail用于查看文件首尾内容;date用于显示和设置系统时间。文章通过具体示例演示了各命令的用法,并特别强调了rm -rf等危险操作可能带来的系统风险。这些命令是Linux系统管理的基础工具,

2025-08-01 21:45:52 633

原创 C++入门自学Day4-- c++类与对象(友元)

本文回顾了C++类与对象相关知识点,重点介绍了友元机制。友元通过friend关键字声明,允许外部函数或类访问类的私有成员,主要形式包括友元函数、友元类和友元成员函数。文章详细讲解了这三种形式的实现方法,特别是运算符重载的友元实现方式。同时指出友元具有单向性、非继承性等特点,会破坏封装性,应谨慎使用。还介绍了内部类作为天生友元的概念,最后总结了友元机制的优缺点和使用注意事项,强调其作为"例外访问权"应合理使用,避免破坏代码封装性。

2025-08-01 16:33:32 622

原创 C++入门自学Day4-- c++类与对象(类的初始化和静态成员)

本文回顾了C++类与对象相关概念,重点介绍了初始化列表和静态成员。初始化列表比构造函数体内赋值更高效,且const成员、引用成员等必须使用初始化列表。静态成员属于类而非对象,需在类外初始化,可通过类名直接访问。静态成员函数无this指针,不能访问非静态成员,而非静态函数可访问静态成员。文章还通过两道面试题和OJ练习题(递归求和与类构造求和)展示了这些概念的实际应用,并提供了避免隐式转换的explicit关键字用法。总结部分以表格形式清晰对比了静态与普通成员的区别。

2025-08-01 14:04:34 1066

原创 C++入门自学Day3-- c++类与对象(赋值运算符与拷贝构造)

本文讲解了C++中赋值运算符重载的实现及其与拷贝构造函数的区别。重点内容包括:1)赋值运算符用于将对象赋值给已存在的对象,定义形式为ClassName& operator=(const ClassName&);2)默认的拷贝构造和赋值运算符都是浅拷贝,动态内存类需显式定义;3)通过Stack类示例演示了深拷贝实现;4)区分了拷贝构造(初始化新对象)和赋值运算符(替换已有对象);5)详细对比了浅拷贝(仅复制指针)和深拷贝(复制数据)的特点及风险。文章强调动态资源类必须自定义这两个函数以避免资源

2025-07-31 18:58:38 378

原创 Linux系统编程Day2-- Linux常用操作

本文介绍了Linux系统下常用命令的基本操作,主要包括文件/目录操作、权限管理、系统管理等核心命令。重点讲解了pwd、ls、cd、touch等基础命令的使用方法,详细说明了绝对路径与相对路径的区别,ls命令的各种参数选项,以及文件时间戳(atime/mtime/ctime)的概念和重要性。文章还介绍了Linux文件系统的目录结构,并提供了使用tree命令可视化目录的方法。通过具体的命令示例,帮助读者快速掌握Linux命令行操作的基本技能。

2025-07-31 14:27:57 1127

原创 计算机操作系统的基本概念和常用的操作系统

摘要:操作系统是管理计算机硬件与软件资源的系统程序,作为用户与硬件交互的桥梁。其核心功能包括进程管理、内存分配、文件系统、设备驱动、用户界面和安全保护。主流操作系统对比:Linux开源免费适合开发者和服务器,Windows图形界面友好适合普通用户和游戏,macOS稳定美观适合创意设计。选择建议:开发者用Linux,办公娱乐用Windows,设计剪辑用macOS。操作系统作为资源管理者和应用运行平台,通过各模块协同工作确保系统高效安全运行。

2025-07-31 11:26:16 551

原创 Linux系统编程Day1-- 免费云服务器获取以及登录操作

本文介绍了学生党可以免费获取云服务器的几种方式:1. 通过GitHub学生开发包获得DigitalOcean等平台$200额度;2. 阿里云、华为云、腾讯云等国内平台的学生认证免费试用;3. Google Cloud新用户$300额度。获取服务器后,可使用Xshell等工具通过SSH连接,进行基本的Linux用户管理操作。这些方案让资金有限的学生也能体验云服务。

2025-07-30 21:03:52 688

原创 Linux系统编程Day1-- Linux系统的概念,主要内容

Linux是一款开源免费的操作系统内核,由Linus Torvalds于1991年开发。作为类Unix系统,它具有稳定性强、安全性高、多用户多任务等特点,广泛应用于服务器、嵌入式设备、超级计算机等领域。完整的Linux系统包含内核、Shell、文件系统等核心组件,并有Ubuntu、CentOS、ArchLinux等多种发行版。学习Linux可从掌握基础命令、Shell编程入手,通过虚拟机或云平台实践。作为信息技术领域的重要基石,Linux技能对开发者、运维人员等职业发展至关重要。

2025-07-30 19:06:27 653

原创 C++入门自学Day3-- c++类与对象(拷贝构造与运算符重载)

本文介绍了C++类成员函数中的拷贝构造函数和运算符重载。主要内容包括:1. 拷贝构造函数的定义与调用时机,强调必须使用引用参数避免递归调用;2. 浅拷贝和深拷贝的区别,当类包含指针成员时必须自定义深拷贝;3. 运算符重载的语法和实现方法,演示了日期类的比较、算术和自增自减运算符重载;4. 完整日期类的实现,包含参数校验、日期运算等功能。文章通过具体代码示例,说明了如何正确实现类的重要成员函数,特别强调了处理动态内存时的深拷贝必要性。

2025-07-30 17:45:10 1135

原创 C++入门自学Day3-- c++类与对象(构造和析构函数)

本文介绍了C++中成员函数的概念与分类,重点讲解了构造函数和析构函数。成员函数分为普通成员函数和特殊成员函数(构造函数/析构函数)。构造函数用于对象初始化,可重载(包括默认/带参构造),支持全缺省参数;析构函数在对象销毁时自动调用,用于资源清理且不可重载。通过Date类和Stack类的实例,演示了构造函数和析构函数的定义、调用时机及实际应用场景,强调了它们在内存管理和资源释放中的重要作用。文章还总结了构造/析构函数的语法特点和使用规则。

2025-07-29 21:21:30 723

原创 C++入门自学Day2-- c++类与对象(初识2)

本文介绍了C++中类与对象的核心概念,重点讲解了this指针的工作原理。在类的非静态成员函数中,编译器会自动传入指向当前对象的this指针,并通过示例代码展示了成员函数中隐含的this指针转换过程。文章还解答了两个关键面试问题:1) this指针作为局部变量存储在栈帧中;2) this指针可以为空,但访问成员变量会导致程序崩溃。最后通过空指针调用成员函数的示例,说明了不同情况下的程序行为,强调访问成员变量时this指针必须有效。

2025-07-28 20:25:00 990

原创 C++入门自学Day2-- c++类与对象(初识)

面向对象与面向过程编程对比:面向过程强调函数和步骤(如C语言),数据与函数分离,适合小型项目;面向对象(如C++)以对象为核心,通过封装、继承和多态实现代码复用,更适合复杂系统。C++类将数据和函数封装为整体,成员函数不占对象内存空间,空类默认占用1字节以保证对象唯一性。C++中struct默认public而class默认private,兼容C语言结构体用法。面向对象编程(OOP)通过类实例化对象,支持三大特性(封装、继承、多态),能更有效管理复杂程序结构。

2025-07-28 19:43:22 727

原创 C++入门自学Day2-- auto关键字

C++11引入的auto关键字简化了变量声明,编译器能自动推导变量类型。auto适用于基本类型、STL容器等,但需注意:必须初始化;同一行声明多个变量时类型需一致;auto会忽略const属性(需用auto&保留)。范围for循环结合auto可简化容器遍历,auto&可修改元素值。优点包括减少冗余、提高可维护性,但需合理使用以保持代码可读性。auto是编译期静态类型推导,不影响运行时性能。

2025-07-27 14:59:00 375

原创 C++入门自学Day1-- C语言的宏函数和C++内联函数

函数调用会产生参数传递、跳转等开销,宏函数和内联函数可避免这种开销。宏函数在预处理阶段进行文本替换,无类型检查但高效;内联函数在编译阶段展开,具有类型安全但可能增加代码体积。宏函数易产生副作用且不可调试,内联函数支持调试和类型检查。C++中可用const替代宏常量,用模板内联函数替代宏函数。内联函数适合短小频繁调用的函数,但编译器可能忽略inline建议。合理使用内联函数能提升性能,但滥用会导致代码膨胀。面试常考察宏与内联的区别、替代方案及适用场景。

2025-07-27 13:59:02 652

原创 C++入门自学Day1-- C++基础

C++基础语法与概念摘要 本文系统介绍了C++编程语言的基础知识,主要包括12个部分:1)C++语言概述,作为兼容C语言的面向对象编程语言;2)程序基本结构;3)变量与数据类型;4)输入输出操作;5)运算符;6)控制结构;7)函数定义与调用,包括缺省参数和函数重载;8)数组与字符串;9)引用与指针的区别;10)命名空间的使用;11)头文件与编译结构;12)常用标准库。重点讲解了C++特有的面向对象特性,如引用、函数重载、命名空间等概念,并通过丰富的代码示例展示了基本语法应用。文章适合C++初学者快速掌握核心

2025-07-27 13:12:11 1433

原创 数据结构自学Day15 -- 非比较排序--计数排序

计数排序是一种非比较型整数排序算法,通过统计元素出现次数实现排序。其核心步骤包括:确定值域范围、创建计数数组统计频次、还原到原数组。时间复杂度为O(n+k),适用于值域较小的整数排序(如考试成绩、年龄),具有速度快、稳定性好的优点,但不适合大值域或非整数数据,且需要额外空间。相比其他排序算法,计数排序在特定场景下效率极高,但通用性较差。

2025-07-26 15:20:23 435

原创 数据结构自学Day14 -- 利用归并排序思想实现“外排序”

本文介绍了归并排序在外排序中的应用。外排序适用于数据量超过内存容量时的磁盘文件排序,归并排序因其分治特性、顺序访问和稳定性成为理想选择。具体实现分为两个步骤:首先将大文件分块读入内存进行内部排序并保存为有序子文件,然后通过多路归并逐步合并子文件形成最终有序文件。文章提供了C语言实现代码,演示了如何将130个数据分成10个子文件排序后再合并的过程。归并排序在外排序中优势明显,包括顺序访问减少磁盘寻址、可扩展性强、稳定性好以及易于实现多路归并优化等特点。

2025-07-26 13:03:50 1391

原创 数据结构自学Day14 -- 归并排序

归并排序是一种基于分治思想的高效排序算法,通过递归或迭代方式将数组分解为最小单元后两两归并。其核心步骤包括分解、排序和合并,时间复杂度稳定为O(nlogn),空间复杂度O(n)。递归实现采用双指针遍历有序子序列,非递归版本通过gap值控制归并跨度。算法具有稳定性好、适合处理大数据等优点,但存在空间开销大、小数组效率低等缺点。优化建议包括:小区间改用插入排序、空间复用、非递归实现等,特别适合链表结构的排序场景。

2025-07-25 14:31:58 1194

原创 数据结构自学Day13 -- 快速排序--“非递归利用栈实现”

快速排序的非递归实现通过显式栈模拟递归过程,避免函数调用栈溢出风险。其核心是将待处理区间压入栈,依次取出进行分区处理。相比递归版本,非递归实现更灵活可控,适用于资源受限场景。优化建议包括:优先处理小区间减少栈深度、小数组转插入排序、优化主元选择策略等。这种方法既保留了快速排序的高效性,又提高了稳定性,尤其适合处理大数据量或近似有序数据。

2025-07-24 12:19:31 549

原创 数据结构自学Day13 -- 快速排序--“前后指针法”

前后指针法是快速排序的一种实现方式,通过双指针(prev和cur)遍历数组,将小于基准值(pivot)的元素移到前面,大于的放后面,最后将pivot置于中间完成分区。该方法逻辑清晰但交换次数较多,性能略逊于挖坑法,适合学习入门或小数据场景。与分而治之、挖坑法共同构成快速排序的三种主要实现方式,各有特点。

2025-07-23 16:17:14 402

原创 数据结构自学Day13 -- 快速排序--“挖坑法”

快速排序采用"分而治之"思想,通过"挖坑法"实现排序:选择一个基准值,将其挖出形成坑;从右找比基准小的填左坑,从左找比基准大的填右坑,循环操作直到左右指针相遇,最后将基准值填入最终坑位。该方法通过覆盖赋值实现原地排序(空间复杂度O(1)),时间复杂度最优为O(nlogn),最差为O(n²)。优化策略如"三数取中"可减少最坏情况发生,提升整体效率,适合通用排序场景。

2025-07-23 14:56:49 542

原创 数据结构自学Day13 -- 快速排序--“分而治之”

对于升序排序:begin找>= key的数,end找<= key的数。对于降序排序:begin找<= key的数,end找>= key的数。快速排序中的begin和end是寻找左右错位元素进行交换的关键。最后交换基准值和begin所指的元素,完成一次划分。对于有序序列,我们需要利用一个“三数取中”规避选取最大或者最小元素作为基准值,增加复杂度和额外的栈的开辟。

2025-07-23 13:47:35 720

原创 数据结构自学Day12-- 排序算法2

本文介绍了选择排序及其优化算法堆排序。选择排序通过每轮选取最小/最大值进行排序,时间复杂度O(n²)。优化后的双向选择排序能同时选取最大最小值。堆排序利用堆结构实现高效排序,时间复杂度O(nlogn),适合大数据量场景。文中提供了两种排序的C语言实现代码,并比较了它们的特性:堆排序虽实现复杂但效率更高,而选择排序更简单适合教学演示。两种算法都是不稳定的原地排序,堆排序更适合工程实践。最后通过表格对比了两种算法的时间复杂度、空间复杂度等关键特征。

2025-07-22 23:13:48 682

原创 数据结构自学Day11-- 排序算法

排序算法是将无序数据按特定顺序排列的方法,可分为升序/降序和内部/外部排序。常见算法包括冒泡(O(n²))、插入(O(n²))、归并(O(nlogn))、快速(O(nlogn))等,各有不同的时间/空间复杂度及稳定性。排序在数据库查询、搜索优化、数据分析等领域广泛应用。文章详细介绍了冒泡、插入和希尔排序的实现代码,其中希尔排序通过分组插入排序显著提升效率(O(n^1.3-2))。不同算法适用于不同场景,如小数据量、内存限制或稳定性要求等。

2025-07-21 16:25:16 1238

原创 数据结构自学Days10 -- 二叉树的常用实现

摘要:本文系统讲解了二叉树的核心概念与应用价值,包括其高效数据组织能力(查找/插入时间复杂度O(logn))、作为高级数据结构(堆/平衡树等)的基础特性。重点提供了C语言实现二叉树的完整代码方案,涵盖创建/销毁、节点统计、遍历算法(前/中/后序及层序遍历)、完全二叉树判断等10项核心功能,通过递归和队列实现关键技术点。文中包含测试用例和可视化思维导图,适合作为二叉树学习的实践指南,为后续C++实现打下基础。

2025-07-20 15:14:22 1178

原创 ACM编程:二叉树的遍历

摘要:该程序通过先序遍历字符串构建二叉树,并进行中序遍历输出。处理流程包括:1)定义二叉树结构体;2)递归创建二叉树,遇到"#"表示空节点;3)实施中序遍历输出结果。关键点在于使用递归方法解析先序字符串,维护索引指针跟踪当前位置。输入为一行先序遍历字符串,输出为中序遍历结果,每个字符后带空格。程序合理处理空树情况,适用于长度不超过100的字符串输入。

2025-07-19 15:14:00 465

原创 Leetcode刷题营第三十四题:平衡二叉树

本文介绍了判断平衡二叉树的两种算法。平衡二叉树要求每个节点的左右子树高度差不超过1。第一种方法先递归计算节点高度,再比较左右子树高度差,时间复杂度较高。第二种方法采用后序遍历优化,在计算高度时实时检查平衡性,避免重复计算,将时间复杂度优化至O(n)。两种方法都通过递归实现,但后者效率更优,适合处理大型二叉树。文章提供了清晰的代码实现和算法思路比较。

2025-07-19 12:04:31 322

原创 Leetcode刷题营第三十三题:对称二叉树

本文介绍了判断二叉树是否对称的算法。通过递归比较左右子树的对称节点,若两棵子树互为镜像则返回true。核心思想是:左子树的左节点与右子树的右节点比较,左子树的右节点与右子树的左节点比较。代码实现了ismirrortree辅助函数进行递归判断,主函数isSymmetric调用该函数检查整棵树是否对称。算法时间复杂度为O(n),空间复杂度为O(h),其中h为树的高度。该方法巧妙利用了镜像对称的性质,通过递归高效解决了问题。

2025-07-18 23:18:36 12402

原创 Leetcode刷题营第三十三题:另一个树的子树

本文介绍了一种检查二叉树root是否包含子树subRoot的算法。通过递归比较两棵树的结构和节点值,当root的某个子树与subRoot完全匹配时返回true,否则返回false。核心思路是先判断两树是否相同,再递归检查root的左右子树。算法包含两个主要函数:isSametree用于比较两树是否相同,isSubtree遍历主树寻找匹配子树。该方法的时间复杂度为O(mn),其中m和n分别是两树的节点数。文章提供了示例、解题思路和C语言实现代码。

2025-07-18 15:27:01 481

原创 Leetcode刷题营第三十二题:相同的二叉树

摘要:本文介绍如何判断两棵二叉树是否相同。通过递归遍历比较节点结构和值:若两节点均为空返回true;若一个为空或值不同返回false;否则递归比较左右子树。算法时间复杂度O(n),空间复杂度O(h),其中h为树高。示例代码演示了该递归实现方法,核心思想是通过深度优先遍历确保每个对应节点都相同。

2025-07-18 13:21:11 339

原创 Leetcode刷题营第三十一题:翻转二叉树

翻转二叉树算法解析:通过递归交换左右子树实现二叉树翻转。给出两种实现方式:1)直接交换根节点的左右子树后递归处理子树;2)从叶节点出发递归交换左右指针。两种方法时间复杂度均为O(n),空间复杂度O(h)(h为树高)。示例演示了输入输出效果,适用于节点数0-100、值范围-100到100的二叉树。该算法展示了递归在二叉树问题中的典型应用。

2025-07-18 12:34:52 355

原创 Leetcode刷题营第二十九,三十题:二叉树的中序以及后序遍历

本文介绍了二叉树的中序和后序遍历实现方法。中序遍历采用递归方式,先计算树节点数量再按左-根-右顺序填充数组;后序遍历类似,顺序为左-右-根。两者都使用辅助函数计算树大小并通过递归完成遍历。文章指出递归方法虽简单,但对于深度大的树可能栈溢出,建议后续学习迭代法(使用栈/队列)和层序遍历等更高效的方法。代码示例展示了C语言实现,适用于节点数0-100的二叉树。

2025-07-17 22:29:00 276

原创 Leetcode刷题营第二十八题:二叉树的前序遍历

摘要: 本文介绍了二叉树前序遍历的实现方法,通过递归算法将节点值存入数组。首先计算树节点数量确定数组大小,然后递归遍历二叉树(根-左-右),依次存储节点值。代码示例包含树节点结构定义、计算树大小的函数Treesize、前序遍历函数PreOrder及主函数preorderTraversal。输入为空时返回空数组,否则返回前序遍历结果数组,时间复杂度为O(n)。适用于节点数≤100的二叉树。

2025-07-17 21:59:45 363

原创 Leetcode刷题营第二十七题:二叉树的最大深度

本文介绍了如何计算二叉树的最大深度。通过递归方法,比较左右子树的深度,取较大者加1得到当前节点的深度。算法时间复杂度为O(n),空间复杂度为O(h),其中h为树高。文章提供了C语言实现代码,并预告后续将介绍使用广度优先搜索(BFS)的层序遍历方法。该算法适用于节点数在0到10^4范围内的二叉树,是解决树深度问题的经典递归方案。

2025-07-17 20:56:09 283

原创 Leetcode刷题营第二十六题:单值二叉树

本文介绍了判断单值二叉树的两种方法。单值二叉树要求所有节点值相同。方法一使用递归遍历,比较每个节点与其左右子节点的值,若不同则返回false。方法二利用队列存储节点,通过双指针遍历比较所有节点值与根节点值。递归方法可能产生栈溢出问题,适用于小树;队列方法适合大树,通过层序遍历避免递归开销。两种方法的时间复杂度均为O(n),空间复杂度分别为O(h)和O(n)。文章提供了C语言实现代码,并分析了不同场景下的适用性。

2025-07-17 19:57:29 258

原创 数据结构自学Day9: 二叉树的遍历

本文介绍了二叉树的两种遍历方式:深度优先遍历(前序、中序、后序)和广度优先遍历(层序)。深度优先遍历通过递归实现,分别以根节点、左子树、右子树的不同访问顺序区分;广度优先遍历则借助队列实现按层访问。文章提供了C语言实现代码,包括节点结构定义、遍历算法以及计算节点数、叶节点数和深度的方法。通过示例二叉树展示了各种遍历顺序,并说明了不同遍历方式的应用场景,如前序遍历用于复制树、中序遍历输出二叉搜索树的升序序列等。

2025-07-17 14:50:19 1521

原创 数据结构自学Day8: 堆的排序以及TopK问题

本文介绍了堆的概念及其应用。堆是一种完全二叉树的逻辑结构,物理上以数组形式存储,分为大根堆(父节点≥子节点)和小根堆(父节点≤子节点)。堆可用于堆排序(小根堆实现降序,大根堆实现升序)和解决TopK问题。重点讨论了使用堆解决最小K个数的算法:先建立K个元素的大根堆,将后续元素与堆顶比较,小于堆顶则替换并重新堆化,最终保留最小的K个元素。该算法通过堆的向下调整操作实现高效排序,特别适合处理大规模数据。文中提供了完整的算法实现代码,包括堆调整和元素交换等关键操作。

2025-07-16 18:16:49 1095

原创 数据结构自学Day7-- 二叉树

本文介绍了二叉树的基本概念和结构。首先阐述了树结构的定义,包括根节点、子节点、父节点等基本概念。然后重点讲解了二叉树的特性,它每个节点最多有两个子节点(左子节点和右子节点),并介绍了满二叉树、完全二叉树等分类。文章还详细说明了二叉树的两种存储方式:顺序存储适合完全二叉树,链式存储更灵活。最后介绍了堆这种特殊的完全二叉树结构,包括大根堆和小根堆的定义,并提供了堆的初始化代码实现。全文系统地梳理了二叉树相关的基础知识。

2025-07-15 23:30:27 914

原创 Leetcode刷题营第二十四题:循环队列的实现

循环队列是一种首尾相连的线性数据结构,通过数组实现可以高效利用存储空间。实现要点包括:1)使用head和rear指针标记队列位置;2)通过(head == rear)判断队列为空;3)通过((rear+1)%(K+1) == head)判断队列已满;4)入队时rear指针循环移动,出队时head指针循环移动。关键操作包括:enQueue(插入元素)、deQueue(删除元素)、Front/Rear(获取首尾元素)等。实现时需注意边界条件处理,如指针越界时重置为0。该数据结构避免了普通队列的存储空间浪费问题。

2025-07-14 16:52:34 453

原创 Leetcode刷题营第二十三题:利用栈实现队列

摘要: 使用双栈实现队列功能,一个栈负责入队(push),另一个负责出队(pop/peek)。当pop栈为空时,将push栈元素全部转移至pop栈,实现FIFO顺序。所有操作均摊时间复杂度为O(1),测试用例验证了队列的正确性。该方法通过元素最多两次移动(push→pop→输出)保证高效性,适合频繁队列操作场景。

2025-07-13 20:22:25 678

空空如也

空空如也

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

TA关注的人

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