自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 插入排序 计数排序

本文介绍了插入排序和计数排序两种算法。插入排序通过将数组分为有序和无序部分,逐步将无序元素插入有序部分,时间复杂度O(n²),空间O(1),稳定性好。计数排序先确定最大值建立计数数组,统计元素出现次数后再重构原数组,时间复杂度O(n)但需要O(m)空间,稳定性较差。两种算法分别适合小规模数据和特定范围整数的排序需求。

2025-07-22 16:26:08 225

原创 选择排序 冒泡排序

本文对比了选择排序和冒泡排序两种基础算法。选择排序通过每次遍历找出最大值并交换到末尾,时间复杂度O(n²),空间复杂度O(1),不稳定。冒泡排序通过相邻元素比较交换将最大值"冒泡"到末尾,同样时间复杂度O(n²)、空间复杂度O(1),但具有稳定性。两种算法都适合小规模数据排序,其中冒泡排序可通过标志位优化提前终止。前者适合交换次数少的场景,后者在稳定性要求时更适用。

2025-07-21 22:44:46 236

原创 搜索二维矩阵 II

存储m和n,用i表示行,j表示列,i从最后一行开始遍历,j从0开始遍历,当前值比目标值小j++,反之i--

2025-05-14 17:16:35 357

原创 力扣 旋转图像

创建一个新的数组,存储旋转后的数组,将数组的第一行存到新创的数组空间的最后一列。

2025-05-12 23:16:27 423

原创 力扣top100 矩阵置零

开辟数组来标记元素为0的行和列,然后将对应的行和列的元素全部置为0;时间复杂度:因为用了两层for循环所以是O(mn)空间复杂度:开辟了两个数组,是O(m+n)

2025-05-10 18:04:20 410

原创 岛屿数量,右值引用和移动语义

右值引用和移动语义:右值引用是一种新的引用类型,用于绑定到右值(临时对象)上。右值引用通过 T&& 语法实现。右值引用的用途用于延长右值的生命周期。为实现移动语义提供支持。移动构造函数移动构造函数用于通过资源转移初始化一个对象。移动赋值运算符移动赋值运算符用于通过资源转移赋值对象。std::move:将左值转换为右值

2024-11-30 14:22:33 263

原创 搜索旋转排序数组

在 C/C++ 中,volatile 关键字的作用是什么?volatile 关键字用于修饰变量,指示编译器该变量的值可能会被外部因素改变作用防止编译器优化:编译器通常会优化代码,比如将变量值缓存到寄存器中,而不是每次都从内存读取。但是如果一个变量被声明为 volatile,编译器会在每次访问时直接从内存中读取或写入,而不会使用寄存器缓存。保证程序正确性:确保编译器不会对 volatile 变量的访问顺序进行重排序,以满足变量在多线程或硬件交互中的正确性需求。volatile关键字与cons

2024-11-30 14:18:31 351

原创 二叉树的层序遍历

函数对象是一个重载了 operator() 的对象。它看起来像一个函数,但本质上是一个类的实例,可以像函数一样被调用。函数对象不仅可以像普通函数一样接受参数并返回值,还可以保持状态并拥有成员变量。特点:函数对象的最重要特点是其类中重载了 operator(),这样对象就可以像普通函数一样被调用。函数对象不仅可以执行操作,还可以保存状态,因为它是一个类的实例。函数对象可以通过成员变量来存储信息,从而允许在函数调用之间保存数据。函数对象常用于 STL 算法中,作为自定义比较器、操作器等。

2024-11-30 14:15:39 450

原创 最长回文子串

多继承指的是一个类可以同时从多个基类继承其成员。多继承的优点功能整合:允许子类结合多个基类的特性和行为,支持更复杂的类设计。代码复用:多继承鼓励通过基类重用现有的代码,从而减少重复实现。灵活性:设计模式中,多继承可以用于表示一个类实现多个行为接口。多继承的缺点菱形继承问题:当多个基类继承同一个基类时,子类可能会有两个或更多基类中同名的成员,从而产生冲突。代码复杂性:多继承增加了类结构的复杂性,难以阅读和维护。命名冲突:如果多个基类有同名成员,子类需要显式指定访问路径,容易出错。

2024-11-30 14:11:32 295

原创 力扣 排序数组

Lambda 表达式是一种匿名函数,允许你在代码中定义简洁、局部的函数行为,而无需显式声明一个函数。Lambda 表达式的作用简化代码:避免声明临时函数,通过直接定义匿名函数提高可读性。与标准库结合:如 std::sort、std::for_each 等算法函数需要传递自定义逻辑时,Lambda 表达式非常方便。闭包特性:捕获上下文中的变量,提供更强的表达能力。提高效率:省去额外的函数定义和调用。

2024-11-30 14:08:03 291

原创 实习冲刺练习 第三十天

用于为类型定义别名的功能,可以帮助代码变得更清晰和简洁。类型别名typedef 是 C 语言中就有的功能,用于为类型定义一个新的名字。简化复杂类型(如指针、函数指针或模板类型)的声明。using 声明C++11 引入了 using 声明,它是 typedef 的现代替代方案。其功能与 typedef 类似,但语法更直观,特别是处理模板时更加灵活。

2024-11-30 14:04:39 288

原创 力扣 三数之和

模板特化模板特化允许为特定类型提供自定义实现,而不是使用通用模板的默认实现。当一个模板需要对某些特定的类型有不同的实现时,就可以对这些类型进行特化。常见于类模板,但也可用于函数模板。模板偏特化模板偏特化允许对模板的某些参数进行部分指定,并提供特定实现。它仅适用于类模板,不支持函数模板。当需要针对模板的某些特定模式提供实现时(例如,针对某些类型组合或模板参数的部分情况),可以使用偏特化。偏特化需要保留未被特化的模板参数。

2024-11-30 14:00:50 418

原创 LRU缓存

智能指针是 C++ 提供的一种对象,用于自动管理动态分配的内存资源。它通过 RAII(资源获取即初始化)的方式,在对象生命周期结束时自动释放内存,避免手动调用 delete 导致的内存泄漏或重复释放问题。智能指针通常封装了原始指针,提供类似指针的行为,同时附加了资源管理功能。

2024-11-30 13:57:29 280

原创 无重复字符的最长子串

八股什么是 C++ 中的移动语义?它的作用是什么? 允许程序在某些情况下通过转移资源所有权,而不是复制资源,从而提高程序的性能。右值引用 (Rvalue Reference)- 使用 && 声明右值引用。- 右值引用是对右值(临时对象)的引用,可以用来区分“临时对象”和“持久对象”。移动构造函数和移动赋值运算符- 通过右值引用实现的特殊函数,用于将资源“移动”到新对象中,而不是拷贝。- 通常涉及“转移所有权”的概念。作用1.避免不必要的拷贝,提升性能:移动语义可以显著减少对象拷贝的开销

2024-11-22 20:13:41 468

原创 只出现一次的数字

什么是 C++ 中的初始化列表?它的作用是什么? 初始化列表(initializer list) 是一种在类的构造函数中初始化成员变量的语法。它允许在进入构造函数主体之前初始化类的成员变量或基类。初始化列表是通过在构造函数的参数列表后加一个冒号 : 和用逗号分隔的初始化表达式来实现的。初始化列表的作用- 初始化常量成员(const)常量成员变量只能在初始化列表中初始化,因为它们一旦被初始化后就不能被修改。- 初始化引用成员(&)引用成员也必须通过初始化列表初始化,因为引用一旦绑定到对象,就

2024-11-21 17:29:23 464

原创 力扣 移动零

什么是 C++ 中的友元函数和友元类?友元函数和友元类是两种允许非成员函数或其他类访问某个类的私有成员和保护成员的机制。它们是通过friend关键字实现的。友元函数友元函数是一个函数,即使它不是某个类的成员,也可以访问该类的私有成员和保护成员。在类定义中,用 friend 关键字声明友元函数友元类友元类是一个类,声明为友元后,它可以访问另一个类的私有成员和保护成员。在类定义中,用 friend 关键字声明友元类友元的作用是什么?有什么注意事项?友元的作用在 C++ 中,友元

2024-11-19 18:00:27 448

原创 力扣 多数元素

什么是 C++ 内联函数?它的作用是什么?内联函数是一种通过提示编译器在调用该函数时将函数的代码直接嵌入到调用点的机制,从而减少函数调用开销的方法。作用与特点减少函数调用开销:在普通函数调用中,程序需要保存上下文信息、跳转到函数地址、执行函数代码并返回结果,而内联函数通过将函数体嵌入调用点,可以省去这些操作,从而提高性能。适用于小型函数:内联函数通常用于代码量小、逻辑简单的函数(例如 getter、setter、计算函数等),以减少函数调用带来的开销。可能增加代码体积(代码膨胀):由于内联函数

2024-11-17 23:20:30 1040

原创 力扣 回文链表

C/C++ 中有哪些类型转换方式? 分别有什么区别?类型转换方式主要包括 隐式类型转换 和 显式类型转换。

2024-11-16 23:00:24 712

原创 力扣 路径总和

什么是 C++ 中的常量表达式? 有什么用途?在 C++ 中,常量表达式(constexpr)是指在编译时就能被计算出来的表达式。它的关键特性是:编译器能够在程序编译阶段就确定表达式的值,而不是等到程序运行时才计算。常量表达式常常用于提高程序效率和简化代码的编写。常量表达式的用途:编译时计算:常量表达式的最主要用途是让某些计算在编译时就完成,减少运行时的计算负担。这样可以提高程序的执行效率,尤其是对于复杂计算或大规模数据处理的场景。常量数组的大小:你可以使用 constexpr 定义数组的大小、

2024-11-15 23:27:40 741

原创 最长公共前缀

C++函数的返回值在内存中的传递过程简单类型返回值:通过寄存器传递,可能在栈上存储。复杂对象返回值:如果没有使用移动语义或RVO,会通过拷贝构造;如果有使用移动语义,则通过移动构造。动态分配内存的返回值:通常是返回指针,调用者负责内存管理。什么是虚拟内存,为什么要使用虚拟内存,虚拟内存可能比物理内存大吗什么是虚拟内存?虚拟内存(Virtual Memory)是一种计算机内存管理技术,它允许操作系统将程序的内存地址空间映射到物理内存或硬盘存储的空间。换句话说,虚拟内存为每个运行中的程序提供了一个

2024-11-14 18:40:19 622

原创 二叉树的直径

C++ 中的异常处理机制是怎样的?C++ 中的异常处理机制使用 try、throw 和 catch 关键字来处理运行时错误。它使得程序能够捕获和响应错误,从而提高程序的健壮性和可维护性。throw 用于抛出异常。可以抛出任何类型的对象(通常是派生自 std::exception 的类),并通过 catch 捕获。catch 块用于捕获并处理由 throw 抛出的异常。你可以有多个 catch 块,用于捕获不同类型的异常。

2024-11-13 18:19:26 614

原创 平衡二叉树

命名空间(namespace)是C++中的一种组织代码的机制,用于将标识符(如函数、变量、类等)分组,避免命名冲突。通过使用命名空间,可以让不同库或模块中的相同名字的标识符不会互相干扰。例如,可以有多个同名的函数,但它们分别属于不同的命名空间。在C++中,命名空间使用关键字namespace来定义。定义时,你可以将相关的函数、类、变量等放入命名空间内部,这样就形成了一个独立的作用域。int a = 10;命名空间可以嵌套。一个命名空间可以包含另一个命名空间。在嵌套的命名空间中,你可以继续组织相关的代码。

2024-11-13 14:15:02 449

原创 二叉树的最大深度

C/C++ 中的预处理器指令有哪些?举例说明其用途。在 C/C++ 编程语言中,预处理器指令用于在编译代码之前对代码进行一些预处理操作。预处理器指令通常以 # 开头,编译器会在编译时将这些指令翻译为具体的动作。以下是一些常用的预处理器指令及其用途:#include用于包含头文件或外部文件,常见于导入标准库头文件或用户定义的头文件。例如: #include // 引入标准库头文件 #include "myHeader.h" // 引入自定义头文件作用:#incl

2024-11-09 23:52:52 843

原创 x的平方根

模板的优点是什么?1. 代码重用性模板允许编写通用代码,而无需为每种数据类型编写重复代码。例如,利用模板可以编写一个通用的排序算法,适用于 int、float、string 等各种数据类型,避免了重复编写相似的代码。2. 类型安全模板在编译时进行类型检查,确保所使用的类型符合预期。例如,若模板函数需要进行加法操作,而传入的类型不支持加法运算,编译器会提示错误,这有助于在编译阶段捕获类型相关的问题。3. 提高代码灵活性使用模板可以让代码更具扩展性。例如,编写一个栈类模板,既可以用于整数栈,也可

2024-11-08 18:39:18 745

原创 C++循环引用

如果没有使用智能指针,可以使用原始指针时小心内存管理,确保在销毁对象时手动处理引用关系,避免出现指针引用死锁或者循环引用的问题。在 32 位系统中,进程最大可访问的内存通常为 2 GB 或 4 GB(具体取决于操作系统和硬件),而在 64 位系统中,理论上可以申请几 TB 的内存(实际上,操作系统和硬件也有自己的限制)。通常,如果两个对象互相引用,而你希望避免循环引用,可以让其中一个对象持有。释放内存,两个对象仍然持有彼此的指针,导致它们的引用计数永远不会归零,从而无法释放内存。时,如果两个对象互相持有。

2024-11-07 22:58:14 559

原创 对称二叉树

malloc 分配失败通常会导致程序崩溃或未定义行为,尤其是在尝试访问未分配或非法内存时。常见的问题包括程序异常终止、内存泄漏、或访问冲突错误。处理分配失败时需要检查返回值是否为 NULL,并进行适当的错误处理。

2024-11-06 23:04:37 732

原创 用栈实现队列

拷贝构造函数是一个特殊的构造函数,用于通过现有对象来初始化新对象。通常在以下几种情况下会调用拷贝构造函数:通过一个对象来初始化另一个同类型的对象(如 A obj2 = obj1;)。通过值传递将对象作为函数参数(如 void func(A obj1))。从一个对象返回另一个对象(如 A func() { return obj; })。作用:拷贝构造函数的主要作用是控制对象复制的方式,特别是当对象包含指向动态分配内存的指针时。它允许你深拷贝(即复制对象时复制对象所拥有的资源,而不是仅仅复制指针的地

2024-11-06 13:07:34 786

原创 力扣 二分查找

C++ 中类的三大特性是什么?请简要解释类的三大特性是封装、继承和多态。封装(Encapsulation):封装是将数据和操作这些数据的方法组合在一起,形成一个类。通过封装,类可以隐藏其内部实现细节,只暴露必要的接口给外部使用。这有助于提高代码的安全性和可维护性。继承(Inheritance):继承是指一个类可以从另一个类派生,获取其属性和方法。这样可以实现代码的重用,并允许创建层次结构,例如基类和派生类之间的关系。派生类可以扩展或重写基类的功能。多态(Polymorphism):多态允许不同

2024-11-04 21:35:12 535

原创 力扣 爬梯子

结构体和联合体有什么区别?能否在声明过程当中缺省名字?主要区别1.内存分配:结构体:结构体中的所有成员都有自己的内存空间,每个成员都可以独立存储值。结构体的大小是所有成员大小之和。联合体:联合体的所有成员共享同一块内存空间,只有一个成员可以在任意时刻存储值。联合体的大小是其最大成员的大小。2.使用场景:结构体:通常用于表示一个复合数据类型,可以包含多种数据类型的多个值,例如一个表示学生信息的结构体,包含名字、年龄、成绩等。联合体:适用于存储多种类型,但在某一时刻只需要存储其中一种类型的数据

2024-11-03 19:16:57 421

原创 二叉树的中序遍历

C、C++中字符串的存储方式有何不同?C语言中的字符串字符数组:C语言中的字符串是以字符数组的形式存储的。字符串以 '\0'(空字符)结尾,标志字符串的结束。手动管理内存:在C中,字符串的内存管理通常是手动的,使用 malloc 和 free 进行动态分配和释放。不可扩展:C语言中的字符数组大小在声明时固定,不能动态扩展。

2024-11-03 19:09:26 379

原创 字符串相加

基本定义int arr[5];// 定义一个包含5个整数的数组初始化时指定大小// 定义并初始化数组不指定大小// 编译器会自动推导出大小为5部分初始化多维数组// 定义并初始化一个2行3列的数组a。

2024-11-01 20:27:03 427

原创 力扣 相交链表

用双指针依次遍历一遍两个链表,第一次相遇就是相交的节点假如A相交前有n个节点 B相交前有m个节点 相交后的节点有x个第一个指针遍历一遍A链表走了n+x个节点第二个指针遍历一遍B链表走了m+x个节点当指针开始遍历完另一个链表相交前的链表时第一个指针走了n+x+m个节点 第二个指针走了m+x+n个节点下一步相遇就是相交的节点

2024-10-31 22:31:18 1358

原创 力扣 环形链表

解释一下空指针和野指针的概念并解释如何避免野指针?空指针是指向地址为0的指针,表示不指向任何有效的对象。野指针是未进行初始化或指向已经释放内存的指针,使用野指针可能会导致程序崩溃。C/C++ 中内存分为哪些区域?分别存储什么内容?有栈区、堆区、全局区(静态储存区)、常量储存区、代码区。栈区储存局部变量、函数参数等。堆区用于动态内存分布。全局区(静态储存区)储存全局变量和静态变量。常量区存储常量。代码区储存程序的二进制代码。

2024-10-30 21:44:04 547

原创 合并两个有序数组

合并两个有序序列方法1:可以先把两个数组元素都合并到一起然后sort,但是时间复杂度偏高方法2:找两个数组最大元素,把最大元素放到数组1的末尾。

2024-10-29 18:27:16 364

原创 数组中的第k个最大元素

回调函数是指通过参数传递给另一个函数的函数。当这个函数执行完毕后,会“回调”这个传入的函数,通常用于处理异步操作或在某些事件发生时执行特定逻辑。

2024-10-28 19:15:34 438

原创 买卖股票的最佳时机

如何使用switch-case语句,有什么注意事项?switch-case 语句根据一个表达式的值选择执行不同的代码块。注意事项包括 case 标签必须是常量表达式,每个 case 后面一般要有 break 语句防止贯穿等。

2024-10-27 19:58:32 358

原创 力扣 两数之和

顺序结构是程序执行的默认方式,语句按顺序依次执行。没有分支或循环的情况。选择结构根据条件的真假执行不同的语句,常见的有 if 语句和 switch 语句。循环结构允许重复执行某些代码,常见的有 for 循环、while 循环和 do while 循环。但是while循环是先判断后执行,do while是先执行后判断。

2024-10-26 16:56:24 441

原创 合并两个有序链表

运算符优先级决定了在表达式中哪些运算符先被执行。比较运算符的优先级高于逻辑运算符。赋值运算符通常低于算术和比较运算符容易混淆的如“p++,先取指针 p 指向的值,然后再将指针 p 自增。

2024-10-25 18:32:51 213

原创 力扣 反转链表

枚举类型是一种用户自定义的数据类型,用于定义一组命名的常量。主要作用:1.增强可读性:使用枚举可以使代码更易读,增强代码的语义性。2.类型安全:枚举提供了一种类型安全的方式来处理变量,编译器可以帮助检查错误,避免产生把不相关的错误混淆在一起。3.限制值的范围:限制了值的取值范围,确保变量只能取预定义的值。4.便于维护:如果需要修改或扩展常量,只需在枚举定义中修改,不需要在代码中查找和修改。

2024-10-24 18:59:42 413 1

原创 有效的括号

常量:常量被声明后,后续的值不会被修改变量:变量被声明后,后续的值可以被修改区别:1.变量和常量被声明后,常量的值不会被修改,变量可以被修改2.变量声明直接声明其类型,常量一般被const或者define修饰3.变量在程序运行时可以占用不同的内存位置,常量通常在编译时就确定其值ps:仅个人观点,后续可能会进行更改。

2024-10-23 21:31:08 416

空空如也

空空如也

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

TA关注的人

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