- 博客(38)
- 收藏
- 关注
原创 【算法专题训练】06、数组&双指针
本文首先介绍了数组的基本特性,包括其连续内存存储、下标访问方式以及固定容量的缺点,并分析了动态数组的扩容机制及其性能问题。接着讲解了指针的概念和双指针技巧,重点阐述了相向双指针和同向双指针的适用场景。随后以LCR 006两数之和问题为例,详细比较了暴力解法、哈希表解法和双指针解法三种实现方式,其中双指针解法充分利用了数组有序的特性,提供了最优解法。最后总结了数组和指针的核心概念,强调了双指针技巧在解决特定问题时的优势。全文通过具体问题分析,系统梳理了数组和指针的相关知识点。
2025-07-29 09:46:14
204
原创 【算法专题训练】05、最大单词长度乘积
题目要求找到两个不含相同字符的字符串,使其长度乘积最大。提供了三种解法: 暴力解法:四重循环逐个比较字符是否重复,时间复杂度高,会超时。 哈希表解法:使用二维数组记录每个字符串包含的字符,将内层比较优化为数组访问,时间复杂度降低到O(n^2)。 位运算解法:将每个字符串的字符集合压缩为一个32位整数,通过位运算快速判断字符是否重复,进一步优化效率。 最优解法是位运算,通过将字符映射为二进制位,使用位与运算判断重复,时间复杂度O(n^2),空间复杂度O(n)。
2025-07-25 14:36:37
328
原创 【算法专题训练】04、只出现一次的数字
本文介绍了两种在数组中找到只出现一次数字的算法。第一种针对其他数字出现两次的情况,使用异或位运算特性(数字异或自己为0),通过遍历数组将所有元素异或得到结果。第二种针对其他数字出现三次的情况,将每个数字转换为二进制形式,统计各位的出现次数后对3取余,最后将余数转为十进制得到结果。文章还总结了异或运算特性、C++数组初始化注意事项以及二进制位数获取方法。这些算法都能在O(n)时间复杂度和O(1)空间复杂度内解决问题。
2025-07-23 09:56:18
221
原创 【算法专题训练】03、比特位计数
摘要: 题目要求计算0到n每个数字的二进制1的个数。暴力解法通过逐位计算,时间复杂度O(nlogn)。优化解法利用位运算性质: 与运算:i & (i-1)可消除最右的1,统计操作次数,时间复杂度O(kn)。 动态规划:基于i & (i-1),递推式为dp[i] = dp[i & (i-1)] + 1,线性时间O(n)。 位移运算:利用奇偶性,dp[i] = dp[i/2] + (i & 1),同样O(n)。动态规划与位移法均高效,推荐使用。
2025-07-18 10:38:24
288
原创 【算法专题训练】02、二进制
摘要: 本文介绍了二进制的基本概念及其在计算机中的应用,并详细讲解了二进制字符串相加的算法实现。二进制由0和1组成,计算机使用二进制存储数据。位运算包括非、与、或等6种操作。以LCR02题目为例,给出了二进制求和的代码实现,核心思路是从字符串末尾遍历,逐位相加并处理进位,最后翻转结果字符串。算法通过字符转换、进位处理和字符串翻转完成二进制加法,适用于任意长度的二进制字符串输入。
2025-07-10 10:46:32
311
原创 【C++并发编程01】初识C++并发编程
且让太多的线程同时运行,会消耗很多操作系统资源,因为每个线程都需要独立的堆栈空间,最后让操作系统运行得更加缓慢。每次任务切换都需要切换一次上下文,为当前运行的任务保存cpu的状态和指令指针,并计算出要切换到哪个任务,并未即将切换到的任务重新加载处理器装填。我们在电脑上能够边听音乐边和其他人在网上聊天就是使用了计算机的并发功能,这也叫计算机的分时系统,使用的是时间切片的技术。在单个进程中运行多个线程,进程中的所有线程都共享地址空间,当一个数据被多个线程同时访问时,需要确保数据的一致性。
2025-05-30 15:54:19
458
原创 [Effective C++]条款30:透彻了解inlining的里里外外
【代码】[Effective C++]条款30:透彻了解inlining的里里外外。
2025-04-11 17:25:25
260
原创 [Effective C++]条款29:为“异常安全”而努力是值得的
异常安全是C++编程中非常重要的概念,它确保程序在抛出异常时仍能保持数据和状态的一致性。场景:需要执行多个操作,要么全部成功,要么全部不执行。解决方案:使用copy-and-swap惯用法。3.1、使用std::exchange。
2025-04-09 19:12:29
476
原创 [Effective C++]条款28:避免返回handles指向对象内部成分
在C++中,返回指向对象内部成分的引用(handles)可能会导致封装性降低和对象空悬问题。为了避免這些问题,可以通过返回const引用来限制对内部数据的修改,从而确保只读访问。
2025-04-08 20:13:26
312
原创 [Effective C++]条款27:尽量少做转型动作
C++中,转型(cast)技术是将一种数据类型转换为另一种数据类型的过程。C++主要提供了两种主要的转型方式:旧式的C转型方式和四种新式的C++转型方式。
2025-04-07 19:39:52
914
原创 [Effective C++]条款26:尽可能延后变量定义的出现时间
在C++中,尽可能延后变量定义的出现时间,主要原因是为了提供代码的可读性,减少不必要的开销以及避免潜在的错误。
2025-04-01 19:23:18
347
原创 [Effective C++]条款25:考虑写出一个不抛异常的swap函数
【代码】[Effective C++]条款25:考虑写出一个不抛异常的swap函数。
2025-03-28 18:45:45
457
原创 [Effective C++]条款24:若所有参数皆需类型转换,请为此采用non-menber函数
【代码】[Effective C++]条款24:若所有参数皆需类型转换,请为此采用non-menber函数。
2025-03-27 20:10:24
328
原创 [Effective C++]条款23:宁以non-member、non-friend替换member函数
这个原则的核心思想是,如果一个函数不需要直接访问类的私有或受保护成员,那么它应该被设计为非成员函数(non-member function),而不是成员函数(member function)在C++中,宁以非成员函数、非友元函数替换成员函数,的设计原则是为了增强封装性、减少类之间的耦合,并提高代码的灵活性和可维护性。有一个坐标点类Point,现在需要实现一个函数来计算两个点的距离。
2025-03-26 19:29:18
266
原创 [Effective C++]条款22:将成员变量声明为private
在C++中,将成员变量声明为private而不是public,主要是为了遵循面向对象编程(OOP)的封装原则。他有助于隐藏对象的内部实现细节,提供更好地控制,安全性和可维护性。
2025-03-24 20:15:00
337
原创 [Effective C++]条款21:必须返回对象时,别妄想返回其reference
【代码】[Effective C++]条款21:必须返回对象时,别妄想返回其reference。
2025-03-23 18:00:00
275
原创 [Effective C++]条款20:宁以 pass-by-reference-to-const替换 pass-by-value
在C++中,函数参数与返回值的数据传递的方式,对程序的性能和正确性有着重要影响。C++默认使用pass-by-value(传值)的方式传递参数。但这种方式在某些情况下会导致性能问题和对象切割问题。C++推荐使用pass-by-reference-to-const(传常量引用)的方式来传递参数。
2025-03-22 18:30:00
393
原创 [Effective C++]条款19:设计class犹如设计type
在C++中,设计一个类(class)就像设计一个新的类型(type),需要仔细考虑很多设计规范,以下是在设计类时需要考虑的问题以及对应解决方案。
2025-03-21 18:30:00
452
原创 [Effective C++]条款18:让接口容易被正确使用,不易被误用
C++中的接口实现有 function接口、class接口和template接口等,每一种接口都是用户与代码互动的方式。
2025-03-20 18:30:00
216
原创 [Effective C++]条款17:以独立语句将newed对象置入智能指针
C++标准中没有规定函数参数的求值顺序,也就是说,编译器可能会以任意顺序对参数进行求值.
2025-03-19 18:00:00
360
原创 [Effective C++]条款16:成对使用new和delete时要采取相同形式
C++中,new和delete时用于动态内存管理的操作符.他们的底层实现和编译器处理涉及到内存分配、对象构造和析构等.
2025-03-18 18:30:00
320
原创 [Effective C++]条款15:在资源管理类中提供对原始资源的访问
在C++中,使用RAII方式管理动态内存资源时,通常会将资源封装在一个类中。
2025-03-16 19:00:00
521
原创 [Effective C++]条款14:在资源管理类中小心coping行为
在C++中,RAII(Resources Acquisition Is Initialization - 资源获取即初始化)是一种重要的资源管理技术,它通过对象的生命周期来管理资源的获取和释放。当一个对象持有一个资源(如互斥锁)时,通常不希望该资源对象被拷贝或赋值,因为这可能导致资源的重复释放或竞争条件。
2025-03-15 19:00:00
221
原创 [Effective C++]条款12:复制对象时勿忘每一个成分
在C++中,拷贝构造函数和拷贝赋值操作符是用于管理对象拷贝行为的两个重要成员函数,如果不进行自定义实现,编译器默认会默认实现这两个函数。
2025-03-13 16:22:17
1003
原创 C++ 浅拷贝&深拷贝
在C++中,深拷贝和浅拷贝都是对象的拷贝方式,两者的主要区别是如何处理动态分类的资源.对于程序中的资源管理错误如内存泄漏、双重释放非常重要.
2025-03-12 21:52:51
373
原创 [Effective C++]条款11:在operator= 中处理“自我赋值”
【代码】[Effective C++]条款11:在operator= 中处理“自我赋值”
2025-03-09 19:00:00
243
原创 [Effective C++]条款10:令operator= 返回一个reference to *this
* 4、this 与 *this **
2025-03-08 22:07:47
291
原创 [Effective C++]条款09:绝不在构造和析构过程中调用virtual函数
【代码】[Effective C++]条款09:绝不在构造和析构过程中调用virtual函数。
2025-03-07 19:40:18
297
原创 [Effective C++]条款08:别让异常逃离析构函数
当异常抛出时,C++会进行栈展开,调用局部对象的析构函数。如果析构函数本身抛出异常,程序将面临两个异常同时存在的情况,这会触发std::terminate,导致程序终止。栈展开的目的是销毁当前作用域内的局部对象,并调用它们的析构函数,以确保资源被正确释放。因此,程序会调用 std::terminate,直接终止程序。如果析构函数抛出异常,可能导致资源未正确释放,因为异常会中断析构函数的正常执行流程。析构函数应确保资源释放,抛出异常会破坏这一原则,增加程序的不确定性。
2025-03-06 21:53:35
356
原创 [Effective C++]条款07:为多态基类声明virtual析构函数
当基类指针指向派生类对象时,如果基类的析构函数不是虚函数,那么通过基类指针删除对象时,只会调用基类的析构函数,而不会调用派生类的析构函数。将上面的基类析构函数设置为虚函数后,通过基类指针删除派生类对象时,会先调用派生类的析构函数,再调用基类的析构函数,确保所有资源正确释放。通过基类指针删除派生类对象时,编译器会根据对象的动态类型(即实际指向的派生类类型)调用正确的析构函数。如果基类的析构函数不是虚函数,编译器会直接调用基类的析构函数,而不会通过虚函数表查找派生类的析构函数。③、调用基类的析构函数。
2025-03-04 19:00:00
481
原创 [Effective C++]条款06:若不想使用编译器自动生成的函数,就该明确拒绝
C++11 之前,可以通过将函数声明为private,并不提供实现,用来阻止外部调用。private修饰的函数,外部不能调用。定义一个不可拷贝的基类,并让目标类继承它。因为基类显式说明没有拷贝函数和拷贝赋值操作符的函数调用功能,其派生子类也具有该特性。C++ 11引入了= delete,可以显式删除函数,明确告诉编译器不要生成delete修饰的函数了。
2025-03-03 19:49:12
146
原创 [Effective C++]条款03:尽可能使用const
3.3)、常量指针常量(Constant Pointer to Constant):指针本身和指针指向的值都不可修改。3.1)、常量指针(Pointer to Constant):指针指向的值不可修改,但指针本身可以指向其他地址。const关键字常用于定义常量,表示某个值、对象或指针在程序运行期间不可修改,也用于修饰函数,引用等.3.2)、指针常量(Constant Pointer):指针本身不可修改,但可以通过指针修改指向的值。const可以修饰函数的返回值,表示返回值是常量,不可修改。
2025-02-28 22:51:33
365
原创 [Effective C++]条款02:尽量以const, enum, inline替换#define
尽量以const, enum, inline替换#define
2025-02-27 20:09:01
358
原创 [Effective C++]条款01:视C++为一个语言联邦
这个概念是由 C++ 之父 Bjarne Stroustrup 提出的,用来描述 C++ 的多范式特性和其设计哲学。C++ 并不是一个单一的语言,而是由多个子语言或范式组成的“联邦”。每种子语言都有自己的规则和特性,但它们共同构成了 C++ 的整体。
2025-02-27 19:57:17
1375
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人