自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 leetcoode 202. 快乐数

可以看到while循环条件是fast!=1,由于1转换后还是1,所以当转换一次到1的情况也能通过。数字转换我们可以使用递归实现,退出无线循环则使用快慢指针(解决链表环)题目重点:数字的转换,无限循环的避免。编写一个算法来判断一个数。

2024-12-09 21:44:51 241

原创 计算c++11 lambada表达式的大小

引用捕获:实际是捕获对象的地址 计算大小是 使用参数指针的内存对齐后的大小值捕获:捕获是拷贝的副本 计算大小时 遵循使用参数的内存对齐后的大小。

2024-12-09 21:33:42 525

原创 leetcode 23. 合并 K 个升序链表

首先我们想到的是归并排序,对链表数组不断进行分割然后合并分割的链表。给你一个链表数组,每个链表都已经按升序排列。将它们合并到一个有序链表中得到。

2024-12-03 16:50:17 378

原创 morris二叉树高级遍历

Morris 二叉树遍历是一种无需额外空间的二叉树遍历算法(即空间复杂度为 O(1)),它利用了树中空闲的右子指针,实现中序遍历或前序遍历。这种方法不需要使用栈或递归,通过动态修改树结构,遍历完成后恢复原树。不需要栈或者递归实现前,中,后遍历二叉树确实很不错,我们省去递归的开销和,多余内存的使用morris遍历是通过临时的连接回到上层节点,然后断开临时连接达到以下效果53 7将5左子树最右子节点4 连接 也就是 4->right=5;同理 1->right=3;

2024-12-02 17:38:09 976

原创 线索二叉树

线索二叉树是一种特殊的二叉树,它在传统二叉树的基础上,利用节点中原本为空的指针域存储指向节点前驱或后继的信息,从而在遍历时不需要递归或栈辅助,能够高效地找到前驱或后继节点。前序遍历:ABDECFG中序遍历:DBEAFCG后序遍历:DEBFGCAint val;bool ltag;//默认无前驱和后继节点 0bool rtag;

2024-11-27 23:58:43 914 1

原创 二叉树的遍历方式(前,中,后,层次)

迭代法以标准迭代法为主,空节点标记内存压力大,stack多次push和pop只是让前中后的遍历变得统一,方便记忆。

2024-11-26 20:51:35 314

原创 leetcode 212. 单词搜索 II

给定一个m x n二维字符网格board和一个单词(字符串)列表words返回所有二维网格上的单词。单词必须按照字母顺序,通过内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。这里我们需要在字符表中查找words中的单词,如果我们暴力搜索,然后再去检验的化,效率很低,并且每个点都需要搜索所以行不通这里我们直接建立words的Trie 然后dfs 建立的Trie 大大减少了dfs的范围。

2024-11-25 23:25:20 284

原创 详解 指针函数,函数指针,函数指针函数

在一些STL源码或者linux源码经常能看到这些东西,确实挺让人头疼。

2024-11-25 22:56:09 595

原创 leetcode 208. 实现 Trie (前缀树)

(发音类似 "try")或者说是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。

2024-11-24 16:45:01 409

原创 leetcode 面试150之 156.LUR 缓存

这里我们如果缓存满了还得删除最久未使用关键字 ,所以我们得维护一个O(1)寻找并且O(1)维护“使用队列”,数组我们无法实现O(1)删除,而双向链表能实现O(1)删除,但是无法实现O(1)查询。所以我们这里用到了unordered_map映射为listnode*,通过map去实现O(1)查询。起初我并未想到用双向链表而是用deque去维护“使用队列”,后者在维护队列无法做到O(1),包超时的。而listnode*双向链表实现O(1)删除。题目重点:O(1)实现查找和删除。

2024-11-21 22:42:39 570

原创 leetcode 25. K 个一组翻转链表

很简单,我们头插法获得反转的链表即可,然后链接每一个反转的链表即可。是一个正整数,它的值小于或等于链表的长度。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。的整数倍,那么请将最后剩余的节点保持原有顺序。

2024-11-20 22:41:07 391

原创 c++引用传参是否能完全避免临时对象?

引用绑定类型不匹配或者传入的是一个右值 则会产生临时对象再传给实参当我们需要修改传入的地址时才使用type*&否则使用type*或者type&即可。

2024-11-20 20:58:23 901

原创 leetcode 面试150 之随机链表的复制

难点在于如何找到新节点的随机节点,我试过用map<int,Node*>来管理,发现有重复val值就行不通了。指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。节点组成,其中每个新节点的值都设为其对应的原节点的值。题解还有一篇递归的解法,雀氏很nb感兴趣的可以去看看。的链表,每个节点包含一个额外增加的随机指针。,该指针可以指向链表中的任何节点或空节点。题目重点:深拷贝,链表状态相同。

2024-11-19 20:26:31 351

原创 c++临时对象详解

临时对象是生命周期非常短的对象,通常在表达式中为了满足某种特定需求而创建,并在表达式求值完成后立即销毁l临时对象是一个右值,可以用左值来接收。

2024-11-18 22:38:59 643

原创 leetcode 面试150之 Z 字形变换

这里我们可以准备一个数组然后按照规律数组去插入相应的stirng对象。这里我们可以准备numRows个string对象来接受s中的字符。,以从上往下、从左到右进行 Z 字形排列。5行:0 1 2 3 4 3 2 1。4行:0 1 2 3 2 1。可以看到上述例子的插入规律是。3行:0 1 2 1。

2024-11-18 21:27:00 366

原创 leetcode 面试150之 无重复字符最长字串

这里无重复我们使用unordered_set<char>通过滑动窗口去实现一个时间为O(N)算法。题目要点:无重复且连续字串。

2024-11-18 21:15:21 97

原创 协程详解之POSIX 上下文切换函数和libco协程库

协程(coroutine)是一种比线程更轻量的并发执行单元。与传统的线程不同,协程的调度通常是由程序控制,而不是操作系统内核。它能够在某个位置挂起执行,并且在稍后的某个时刻恢复,从而实现高效的任务切换。协程库在不同语言和框架中有不同的实现。

2024-11-14 23:32:20 799

原创 leetcode面试 150题之 三数之和 复刷日记

这里我们选择了一个值后 再去通过双指针找与该值到和为0的二元组,这里的去重就简单了,已经固定了一个值,这里的二元组只要有一个和之前的相等则指针相应的++或者--直到找不到二元组和固定值为相反数为止。然后我尝试只固定一个值,因为上面的 -4 -2 -2 0 2 2 4 中就是因为我锁定l,r导致无论是l++,还是r--都会丢掉一个解。这里代码只能处理一半的数据 当遇到 -4 -2 -2 0 2 2 4时就漏情况了,而且处理起来非常麻烦。我先想到的是双指针固定两个数然后二分找第三个数(有点想当然)

2024-11-13 21:32:46 246

原创 C++内存泄漏检查工具——Valgrind(--tool = memcheck)

内存泄漏检测:能够跟踪动态内存分配,确保分配的内存在不再需要时被正确释放。越界访问检测:帮助识别动态数组越界、空指针解引用等错误。未初始化变量检测:检测使用未初始化变量的情况。典型应用场景:当程序涉及大量的动态内存分配,或频繁出现无效内存访问、内存泄漏等问题时,用 Valgrind 非常有效。借鉴于C++内存泄漏检查工具——Valgrind(--tool = memcheck) - unique_ptr - 博客园。

2024-11-12 20:57:53 964

原创 野指针和悬空指针详解

悬空指针是指向已被释放或超出作用域的内存区域的指针。此类指针原本指向有效的内存或对象,但当该内存被释放或对象生命周期结束后,指针依然指向这块无效的内存区域。这种指针从未指向一个合法的内存地址,因此是完全不可预测的,可能指向任意地址。可以看到虽然delete后指针对象仍然存在,但是指针已经失效,内存已被释放。:函数内部的局部变量地址在函数返回后被销毁,指向它的指针就成为悬空指针。delete或者free是释放指针指向内存 指针本身并未被处理。:指针算术操作导致越界,指针指向无效区域。

2024-11-12 19:46:20 542

原创 链表的归并排序

两种方法递归法(自顶向下法)迭代法(自底向上法)

2024-11-07 23:13:27 605 2

原创 排序算法之归并排序

(Divide and Conquer),用于将一个无序数组或链表按照一定的顺序排序(通常是升序)。归并排序的核心思想是:将数组分为两个子数组,分别排序后再合并起来,最终得到一个有序的数组。这里的迭代法的空间复杂度为O(n),递归法空间复杂度为 O(nlog⁡n),你可以传一个临时数组以达到O(n)并且可以减少new和delete带来的开销。可以看出它是不断的递归进入自己的左右区间,递归到左右只有一个元素然后再向上合并。通过增加归并排序区间,多次小区间的归并,从而实现整个数组的排序。

2024-11-07 20:11:15 290

原创 linux下数据库连接池的实现

【代码】linux下数据库连接池的实现。

2024-10-28 20:50:45 126

原创 c11 lambada表达式

C++11 引入了 Lambda 表达式,为 C++ 程序员提供了一种方便的匿名函数对象创建方式。Lambda 表达式广泛用于简化代码,尤其是在需要小段函数逻辑作为参数传递给算法或线程时。

2024-10-28 20:19:24 414

原创 c++11 override和final关键字

C++11引入了一种新的方式来控制虚函数的重载,称为“显式虚函数重载”(Explicit Virtual Function Override)。用于类时,它阻止该类被继承。当用于虚函数时,它阻止该函数在派生类中被进一步重写。这提供了一种明确表达设计意图的方式,并能够避免不必要的运行时错误。可以提高代码的可读性,并且帮助编译器检查派生类是否真正重载了基类中的虚函数,避免因拼写错误或函数签名不匹配而导致的问题。这个关键字明确指出一个成员函数意图重写一个基类的虚函数。关键字被引入作为类和虚函数的新修饰符。

2024-10-28 08:49:18 206

原创 c++11委托构造函数

委托构造函数是C++11新增的特性,它允许一个构造函数在其成员初始化列表中调用同一个类的另一个构造函数,从而避免在多个构造函数中重复相同的初始化代码。其主要目的是减少代码重复,提高代码的复用性和清晰度。

2024-10-23 20:35:33 166

原创 c++11智能指针 避免内存泄漏

简单来说内存泄漏是指程序中动态分配的内存,一块无法重新使用的内存资源智能指针是C++11引入的一种用于管理动态内存的类模板,它们提供了更安全和更方便的内存管理方式,以避免常见的内存管理问题,如内存泄漏和悬挂指针。智能指针会自动释放其所管理的对象,从而减少手动管理内存的需要。和。

2024-10-21 17:55:26 876

原创 enum枚举和强类型enum枚举

特性普通枚举 (enum强类型枚举 (enum class隐式转换允许隐式转换为整型不允许隐式转换,必须显式转换作用域枚举成员在外部可见枚举成员在枚举的作用域内可见命名冲突可能导致命名冲突避免命名冲突底层类型默认是int,可以指定默认是int,也可以指定语法使用成员名直接访问需要使用作用域运算符访问成员。

2024-10-21 16:11:18 235

原创 c++基于跳表实现的轻量级KV存储

/二级指针 各级指向节下一个节点指针的数组private:K Key;V Value;return Key;public:// 模拟概率//插入//展示跳表//通过key查询节点//删除节点//将数据存入文件//将文件的数据载入跳表//节点个数private://读取数据//文件读取到数据是否合法private://索引最大可支持的级数//当前达到的最大级数//头哨兵节点//输出流。

2024-07-16 16:32:13 424

原创 c++ STL深度探索之迭代器(算法和容器之间的桥梁)

定义:迭代器是一种数据类型,用于遍历容器中的元素。与C语言中的指针类似,迭代器允许我们访问容器中的元素,但提供了更丰富的操作和功能。用途:通过迭代器,我们可以读取、修改容器中某个迭代器所指向的元素值。迭代器支持++、--等操作符,可以从容器中的一个元素移动到另一个元素。类型:C++标准库为不同的容器定义了不同类型的迭代器。根据功能的不同,迭代器可以分为输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。

2024-06-23 20:45:18 2144

原创 C++双端队列deque源码的深度学习(stack,queue的默认底层容器)

deque是C++标准模板库(STL)中的一个容器,代表“双端队列”(double-ended queue)。deque支持在其前端(front)和后端(back)进行快速插入和删除操作,并且它在序列的中间插入和删除元素时通常比vector或list更高效。

2024-06-16 14:52:03 2177

原创 c++哈希表hash_table的深度学习(hash_map,un和hash_set的底层实现)

哈希表(Hash Table)是一种数据结构,它使用哈希函数将键(key)映射到桶(bucket)或槽(slot)中,可以直接通过相应的键值直接对数据进行访问,高效的插入,删除,查找。

2024-06-12 22:27:34 1543 1

原创 为什么c++不支持多次后置++而支持多次前置++?

cpp不支持多次后置++,因为后置++返回的是++操作前的原始数据用temp存储是一个临时数据(函数return后生命周期到了),也就是说返回的是一个右值,而++操作是在一个存在的对象上(也可以是基础类型)操作不能对右值操作所以会报错。也就是说传回的数据是已经存在的对象是个左值,所以你对一个已有对象多次前置++操作是没有问题的。cpp支持前置++,前置++返回的是++操作后的数据,通常return该数据的引用。

2024-06-03 17:00:31 560 1

原创 基于linux下c实现的简单版线程池

【代码】基于linux下c实现的简单版线程池。

2024-05-28 15:28:51 282 1

原创 详解c++左值右值,引用,左值引用,右值引用,移动语义,完美转发,

右值:右值通常位于等号的右侧,通常是一个临时的,无标识符的值例如字面常量,临时对象,函数返回的对象等,无法对其取地址,赋值的操作。左值:左值是具有标识符(变量名)的表达式,在内存中有一个确定的地址,可以被赋值,它可以是变量,对象,返回引用的函数等。比较简单,我们这里不在赘述。

2024-05-14 18:08:44 148

22第二周周赛.rar

22第二周周赛.rar

2022-11-12

空空如也

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

TA关注的人

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