- 博客(56)
- 收藏
- 关注
原创 二叉树深度计算
本文介绍了两种计算二叉树深度的方法:递归法和迭代法。递归法采用深度优先遍历,通过比较左右子树的最大深度加1返回当前深度;迭代法使用广度优先遍历,借助队列逐层统计深度。两种方法分别通过递归调用和层序遍历实现,最终都能准确计算出二叉树的最大深度。测试用例演示了两种方法在相同二叉树上的计算结果一致,验证了算法的正确性。
2025-05-29 10:00:00
296
原创 使用栈实现队列功能
本文介绍用双栈模拟队列的实现方法。通过设计输入栈(instack)和输出栈(outstack),入队操作直接压入instack,出队时若outstack为空则将instack元素全部转移到outstack再弹出。这种设计使得入队时间复杂度为O(1),出队操作在摊还分析下也为O(1)。关键点在于利用栈的LIFO特性,通过元素转移实现了队列的FIFO特性。文中提供了C++实现代码,并分析了各操作的时间复杂度。
2025-05-28 16:06:04
186
原创 单链表反序实现
摘要:链表反转可通过迭代或递归实现。迭代法使用三个指针(prev、curr、next)逐步调整节点指向,时间复杂度O(n),空间复杂度O(1)。递归法则将问题分解为头节点和子链表,通过递归调用反转子链表后调整指针方向,时间复杂度O(n),空间复杂度O(n)(栈空间)。两种方法最终都将链表反转为5→4→3→2→1的形式,其中递归法需注意每次调用创建新变量和调用栈的特性。
2025-05-28 15:46:34
620
原创 c++算法题
文章摘要:本文讨论字符串替换操作replace的实现方法,重点分析在笔试场景下的可行方案。首先解释了替换操作的定义:若t是s的子串,则用v替换t在s中的所有出现。针对笔试限制,作者提出两种思路:1)通过滑窗遍历记录匹配位置,但实现较复杂;2)更实用的方法是用string的find和replace函数。最后给出具体实现代码,通过循环查找和替换子串,并更新查找起始位置来避免重复处理。
2025-05-26 21:56:50
241
原创 c++算法题
本文探讨了基于数组实现的循环队列操作。队空条件为length=0,队满条件为length=m。插入操作(enqueue)首先检查队列是否已满,未满时在rear位置插入元素,rear指针循环移动(rear=(rear+1)%m),并增加length。删除操作(dequeue)通过rear和length计算队头位置(front=(rear-length+m)%m),取出元素后仅减少length,实现逻辑删除。关键点在于利用取模运算实现指针循环移动,以及通过length变量简化队头位置计算,避免单独维护front
2025-05-26 18:31:11
259
原创 编写一个算法frequency,统计在一个输入字符串中各个不同字符出现的频度。用适当的测试数据来验证这个算法
本文介绍了四种统计字符串字符频率的C++实现方法:1)数组索引法,通过ASCII码映射到固定数组;2)std::map容器实现有序键值对统计;3)std::unordered_map实现无序统计;4)std::count逐个字符统计法。每种方法都给出了代码示例和测试用例,处理范围为0-9数字和A-Z字母,忽略非法字符。测试案例包括混合字符、含非法字符及空字符串情况,验证了各方法的正确性。这些实现展示了不同数据结构在字符频率统计中的应用差异。
2025-05-26 17:38:02
659
原创 输入一个字符串,将其逆序后输出
本文介绍了四种反转字符串的方法:1)使用标准库reverse函数直接反转;2)双指针原地交换首尾字符;3)利用反向迭代器构造新字符串;4)递归逆序输出(不修改原字符串)。每种方法都给出了C++实现代码示例,输入"HelloWorld"可输出反转结果"dlroWolleH"。这些方案涵盖了不同的实现思路,包括库函数调用、指针操作、迭代器构造和递归技术。
2025-05-26 17:09:39
145
原创 十六进制字符转十进制算法
十六进制与十进制的转换方法主要包括正序和逆序两种实现方式。正序法从左到右遍历字符串,每次将当前结果乘以16后加上新字符的十进制值。逆序法则从右到左处理,使用动态调整的权值(16^n)进行累加。两种方法都能正确处理0-9和A-F(a-f)字符,并自动跳过"0x"前缀。转换时需注意十六进制是满16进1,其字符集包含0-9和A-F表示10-15。代码实现中避免了使用效率较低的math.pow函数,而是采用更高效的位权累加方式。
2025-05-26 16:41:05
571
原创 选择排序算法研究
本文探讨了选择排序的实现原理与优化思路。作者通过对比物理分割和原地操作两种方式,指出选择排序的核心在于将数组分为已排序和未排序两部分,每次从未排序部分找出最小值放入已排序部分尾部。文章提供了C++实现代码,采用i作为分界点实现了原地操作,避免了物理分割带来的内存开销和复制代价。相比创建两个独立序列的方案,这种实现方式在空间和时间效率上更具优势,只需一次交换即可完成元素归位。
2025-05-25 20:27:02
438
原创 文件系统交互实现
本文介绍了如何完善一个基于QT控件的文件系统程序,主要实现了右键菜单功能,用户可以通过右键菜单对选中的文件或目录进行删除、重命名、新建文件或目录等操作。程序首先通过QMenu和QAction创建了右键菜单,并根据用户选中的项(文件或目录)动态调整菜单项。具体实现包括:判断是否已打开目录、获取选中项的索引、根据文件类型添加相应的菜单项,并通过槽函数处理具体的操作逻辑。例如,删除操作会弹出确认对话框,重命名操作会弹窗输入新文件名,新建文件或目录则会弹窗输入名称并创建。通过这些功能,用户可以更方便地管理文件系统。
2025-05-16 19:47:08
696
原创 论QT6多线程技术
以前我多线程使用传统的继承qthread重写run()或者继承qrunable类把对象丢到线程池解决。经过昨天的面试让我了解到新的技术,我之前看到过只不过没有详细的去了解movetotread技术,这个技术是qt5推出的,qt6还在延续使用。
2025-05-15 17:18:14
541
原创 今天面试遇到的一些问题
作者在武汉的首次面试中感受到了激烈的竞争和较高的技术要求,相较于杭州更为严峻。面试中遇到了多个技术问题,包括控件操作、数组查找、线程管理、数据类型大小、信号槽连接、集合操作、联合体使用以及项目经历的详细梳理。作者意识到自己在某些技术细节上的生疏,并计划在接下来的时间里针对这些问题进行深入研究和复习,以提升自己的技术熟练度和面试表现。
2025-05-15 01:11:02
234
原创 QT控件文件系统的实现
本文介绍了如何使用Qt的Model-View模式实现文件系统管理,主要涉及QFileSystemModel和QTreeView的配合使用。通过QFileDialog实现目录选择功能,点击按钮后弹出对话框,用户选择目录后,QFileSystemModel会更新根路径,QTreeView同步显示。代码展示了如何设置根路径、绑定视图更新以及显示当前目录。此外,还介绍了如何通过setFilter()过滤文件类型,以及如何通过模型索引获取文件信息。文章还提到启用QTreeView的编辑功能,支持双击重命名,并提供了添
2025-05-15 00:43:49
371
原创 QListWedget控件使用指南
文章介绍了QListWidget类及其相关函数的使用方法,包括如何创建、添加、删除和操作列表项。QListWidget是一个用于显示和管理列表项的控件,支持添加、插入、删除、排序等操作。文章还展示了如何在UI界面中初始化列表项,并通过按钮点击事件动态添加或删除项。此外,文章提醒在UI界面中已自动连接的槽函数无需再次手动连接,以避免重复触发信号。通过示例代码,详细说明了如何实现这些功能,并提供了调试信息以帮助理解操作过程。
2025-05-14 23:04:50
1012
原创 运动控制插补--逐点比较法
在数控机床中,钻头在微观视角下并非直线移动,而是呈现阶梯状路径。通过直线插补的逐点比较法,根据偏差在x或y方向给予脉冲,逐步接近目标。以起点O(0,0)和终点A(6,4)为例,通过偏差公式F=F-|ye|或F=F+|xe|,逐步计算并调整钻头位置。每一步的偏差判别、坐标进给、偏差计算和终点判断共同决定了钻头的实际运动轨迹,最终形成一条接近直线的折线路径。这一过程展示了数控机床在微观层面上的精确控制机制。
2025-05-12 16:48:44
361
原创 opencv处理图像(二)
在程序线程设计中,主线程负责图形渲染,而OpenGL和OpenCV技术用于图像处理。考虑到资源浪费和线程管理问题,不建议为OpenCV单独创建线程。通过继承QThread并重写run()方法,可以在子线程中处理OpenCV逻辑,并通过信号传递结果。线程池技术(如QThreadPool)更适合处理短暂、离散的任务,通过复用线程减少开销。对于图像处理任务,可以定义任务类并提交到线程池,避免频繁的深拷贝操作。主线程负责用户交互和结果展示,而线程池中的工作线程执行具体的图像处理任务。这种设计提高了资源利用率和程序性
2025-05-10 16:07:52
462
原创 opencv处理图像(一)
本文介绍了一个基于C++和Qt6开发的图像处理项目设计。项目中,主线程使用OpenGL渲染图像,同时通过OpenCV进行图像处理任务,如高斯模糊和图像轮廓提取。OpenCV任务通过线程池异步执行,处理结果通过信号槽机制传回主线程。文章还详细讨论了OpenCV中Mat矩阵与OpenGL在图像通道和坐标轴上的差异,并提供了高斯模糊和灰度图转换的具体实现方法。最后,作者提到线程设计部分尚未完成,计划后续补充。
2025-05-10 02:06:46
618
1
原创 图形渲染+事件处理最终版
我们设计他的逻辑是鼠标左键按下以后,m_lastmousepos会记录鼠标的当前位置,然后鼠标拖动,用现在鼠标的位置-上次鼠标的位置得到的是一个移动路径的向量,注意这里操作角度用的数据都是向量,然后更新旋转矩阵{x,y,z},绕x轴正向旋转就是m_rotationangles.x()+delta.y()*0.5f,为什么加的是delta的y,可以试着想一下,想让三角形绕x轴旋转不就是用鼠标向上向下移动。我这里就把他后移了三个单位,十分简陋,因为设置了和没设置没区别,就懒得设置他了,我这是不是有些敷衍哈哈。
2025-05-08 23:35:05
361
原创 纹理过滤方式和纹理包裹方式
临近过滤(Nearest)和双线性插值过滤(Linear),什么时候用什么过滤方式其实看个人选择,区别就是临近过滤是当需要的像素大于图片像素时候,一些像素点需要复用与他相近的图片像素颜色,如果复用的过多会导致图片像素感较严重,如果想要平滑点就用双线性插值过滤。当图片像素>需要像素时:使用Nearest。当图片像素<需要像素时:使用Linear。
2025-05-03 10:00:00
146
原创 纹理对象创建
纹理对象通俗点就是贴图,像游戏的皮肤什么就是纹理。一旦纹理生成并且数据完成传输,纹理对象就没有存在的必要了,我们就可以将内存中指针指向的这一片数据给他释放了。
2025-05-02 21:15:16
520
原创 EBO的使用
比如在OpenGL绘制三角形的时候,假设有四个顶点,我称他们分别为1,2,3,4号顶点,常规绘制三角形函数是按三个点为一组,{1,2,3,4},他就只会绘制123为三角形,4就不管了,如果我们想拿一个共用边加上4绘制三角形比如拿12边,就需要写成{1,2,3,4,1,2},他不够灵活,像这样存储的话,如果每个顶点还有颜色什么的数据就会导致需要的内存过大,这里就用到EBO了,顶点数据差不多,区别就在于当引入顶点的时候只需要存储顶点数据,其他的属性通过绑定VAO实现可重复调用,以达到节省内存的作用。
2025-05-02 00:11:21
342
原创 QT6链接mysql数据库
如果是ubantu linux系统就按照这个做:(这里要注意一下,他后面有个地方说要创建一个build目录,然后cd到build目录中,中间应该是省略了复制的步骤,我是直接在sqldrivers那里编译了)参考我发的链接问题就能解决,为了避免链接变成vip文章,后面我自及也会整理一篇完整的流程出来,如果觉得我的文章对你有帮助请不要吝惜你的一件三联哦。qt6中是删除了MySQL数据库驱动的,如果需要我们要自己去下载驱动原文件编译。下面是我的整理,血的教训,按照我筛选的能解决。
2025-04-29 16:40:47
168
原创 C++循环链表
循环链表是单链表和双链表的一种演化,原理是一样的,只是逻辑上需要改一下,像单链表,他的结构是头节点->尾节点->nll,循环链表只需要把尾节点的next由原来的指向null改为指向头节点,遍历链表的时候,到null会判定遍历结束,而循环链表是回到头部节点的时候遍历结束,这里要注意设置好遍历逻辑,不然会出现死循环。双链表的循环同理,这里就不去实现它了,想学习实现他参考我之前写的单链表和双链表实现的文章,里面有程序,拿出来改下逻辑就行了,这里就介绍一下。
2025-04-15 08:00:00
254
原创 c++队列的实现
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。
2025-04-14 18:51:19
649
原创 C++智能指针介绍
C++智能指针是用于自动管理动态内存的工具,通过RAII(Resource Acquisition Is Initialization)机制确保资源在不再需要时被正确释放,从而避免内存泄漏。
2025-04-14 08:00:00
678
原创 C++栈链的实现(链式栈)
定义一个结构体实现栈的定义,链式栈是以节点为单位,每个节点包含data值和next指针指向下一个节点,因为是栈结构,遵循后进先出的原则,栈顶指针指向头节点。(动态节点链接)存储数据,通过指针管理栈顶元素。(可能不适用于非整型数据)
2025-04-12 03:11:58
650
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人