自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Qt开源项目】— ModbusScope-day 7

本文介绍了GraphView绘图层深入攻略,重点解析了GraphView如何将GraphDataModel中的数据可视化并实现交互功能。内容包括:1) GraphView架构与初始化,分析其类结构和组件分工;2) 曲线渲染与数据更新机制,展示数据传递流程;3) 缩放、平移等交互功能的实现原理。通过详细代码分析和调试建议,帮助读者在2小时内掌握GraphView的核心功能和工作机制。

2025-12-17 12:00:00 610

原创 【Qt开源项目】— ModbusScope-day 6

通过DataFileExporter/DataFileParser,将QCPGraphDataContainer序列化为文件。:用2小时深入掌握GraphDataModel的数据存储机制、信号传递和与视图的交互,理解模型在MVC架构中的核心作用。: QCPGraphDataContainer针对绘图优化,支持快速范围查找、数据排序等操作。: QCustomPlot有数据裁剪机制,可以限制显示范围的数据量。:在GraphData::appendData中设置断点,观察数据添加过程。

2025-12-16 12:00:00 685

原创 【Qt开源项目】— ModbusScope-进度规划

完成整个ModbusScope框架的系统学习,达到能够进行定制开发和功能扩展的水平。根据我们之前的讨论和你的学习进度,我来为你制定一个。:约11天 × 2小时 = 22小时。:约7天 × 2小时 = 14小时。:约9天(每天1-2小时)

2025-12-15 16:20:57 755

原创 【Qt开源项目】— ModbusScope-day 5

摘要:本文深入解析了ModbusScope数据处理层的核心组件ExpressionParser与GraphDataHandler。上午重点剖析了ExpressionParser如何将用户输入的寄存器表达式(如{40001})转换为可计算的r(索引)格式,包括正则解析、寄存器去重和索引映射机制。下午聚焦GraphDataHandler如何通过QMuParser计算引擎实现表达式求值,分析了静态寄存器值存储、回调机制及实时计算流程。通过添加调试断点和测试用例,可直观观察从原始表达式到最终数值的完整转换过程,帮助

2025-12-15 16:00:32 885

原创 【Qt开源项目】— ModbusScope-day 4

摘要: 本文介绍了第3天的实战任务——通过调试追踪“开始通信”功能的数据流路径。步骤包括:在mainwindow.cpp和modbuspoll.cpp设置断点,验证信号槽触发的ModbusPoll::startCommunication调用流程,并可扩展至模拟数据绘图。第一阶段成果总结为:1)掌握环境搭建与软件功能;2)理解“模型-视图”架构、模块依赖关系及事件驱动机制;3)建立核心数据流地图(如程序启动→用户点击→Modbus通信→数据处理→界面更新)。建议后续从通信层(ModbusPoll)或绘图层(G

2025-12-15 15:00:00 345

原创 【Qt开源项目】— ModbusScope-day 3

摘要:程序骨架与核心数据流分析 本文剖析了软件的核心架构,重点围绕MainApp和MainWindow两大核心类展开。MainApp作为程序入口,负责创建6个核心数据模型和主窗口;MainWindow则作为UI容器,协调ModbusPoll、GraphView等模块工作。通过信号槽机制实现从数据采集(ModbusPoll)→处理(GraphDataHandler)→显示(GraphView)的异步数据流。学习者需掌握模块间的静态持有关系,并能描述关键数据流路径。最终目标是能独立绘制核心架构图并清晰解释各模块

2025-12-14 13:00:00 333

原创 【Qt开源项目】— ModbusScope-day 2

摘要:本文介绍了快速掌握ModbusScope软件的第一阶段学习攻略。首先通过Git获取代码并完成环境搭建,确保项目成功编译。随后建议用户先体验软件界面功能,包括菜单操作、连接设置和视图切换,建立初步认知。学习目标包括完成本地部署、了解软件界面模块构成,并能口头描述ModbusScope的核心功能——作为一款跨平台的Modbus设备数据图形化监控工具,具有主绘图区和寄存器管理等功能。整个第一阶段规划2-3天完成,首日重点在于环境准备和感性认识。(148字)

2025-12-13 17:39:24 246

原创 【Qt开源项目】— ModbusScope-day 1

本文提供了一个系统学习ModbusScope框架的详细指南,分为三个阶段: 建立整体认知(2-3天):运行程序、理解架构和核心流程; 深入核心模块(5-7天):重点研究通信层、数据处理、数据模型和绘图交互; 扩展学习(3-4天):掌握导入导出、日志管理等辅助功能。 学习采用笔记驱动和问题导向方法,强调动手验证,通过调试和修改加深理解。计划在2-3周内完成,最终能完整描述数据从采集到显示的流程,并具备简单二次开发能力。

2025-12-13 17:29:29 673

原创 day123—二分查找—H 指数 II(LeetCode-275)

摘要:本文提出一种基于二分查找的算法来计算科研人员的H指数。算法首先对论文引用次数进行排序,然后在[0,n]范围内使用二分查找确定最大h值,使得至少有h篇论文的被引用次数≥h次。每次迭代统计满足条件的论文数量,通过比较确定h值的可行性。该算法时间复杂度为O(nlogn),适用于中等规模数据,逻辑清晰且易于实现。

2025-12-11 21:05:59 851

原创 day122—二分查找—完成旅途的最少时间(LeetCode-2187)

摘要:本文提出了一种基于二分查找的算法,用于计算多辆公交车完成指定旅途数所需的最少时间。算法首先确定时间范围[0,最慢车×总趟数],然后通过二分查找寻找满足条件的最小时间。每次验证时计算当前时间内所有车辆能完成的趟数总和,若不足则增大时间,否则尝试减小时间。算法利用提前退出优化和开区间二分查找提高效率,时间复杂度为O(nlogT)。示例表明该算法能正确找到最优解,如输入[1,2,3]和5趟时输出3。

2025-12-11 16:58:58 571

原创 day121—二分查找—爱吃香蕉的珂珂(LeetCode-875)

摘要:本文解决Koko在h小时内吃完所有香蕉堆的最小速度k问题。采用二分查找法,在[1,最大堆香蕉数]范围内搜索最小可行速度。每次验证计算当前速度所需总时间,若超过h则增大速度,否则尝试更小速度。算法时间复杂度为O(nlogM),其中n为堆数,M为最大堆香蕉数。示例验证了算法的正确性,如输入[3,6,7,11]和h=8时,输出最小速度k=4。

2025-12-11 16:30:53 377

原创 day120—二分查找—统计公平数对的数目(LeetCode-2563)

摘要:该算法统计数组中满足条件的有序对(i,j),其中i<j且nums[i]+nums[j]在[lower,upper]范围内。首先对数组排序,然后对每个元素nums[j],在其左侧区间[0,j)内使用二分查找确定满足条件的nums[i]范围。通过两次二分查找分别确定下界和上界,最终统计满足条件的数对数量。时间复杂度为O(nlogn),适用于大规模数据。示例输入nums=[0,1,7,4,4,5],lower=3,upper=6时,输出6个有效数对。

2025-12-11 15:31:30 442

原创 day119—二分查找—两个数组间的距离值(LeetCode-1385)

摘要:本文提出了一种计算两个数组距离值的算法。给定数组arr1、arr2和距离d,距离值定义为arr1中满足条件的元素数目:对于arr1中的每个元素,arr2中不存在任何元素与其绝对差≤d。算法首先对arr2排序,然后对每个arr1元素使用二分查找判断是否存在arr2元素落在区间[x-d,x+d]内。时间复杂度为O((m+n)logm),其中m和n分别为两个数组的长度。示例验证了算法的正确性,当输入arr1=[4,5,8]、arr2=[10,9,1,8]、d=2时,正确输出距离值2。

2025-12-07 23:50:34 222

原创 day118—二分查找—咒语和药水的成功对数(LeetCode-2300)

本文提出了一种高效算法,用于统计咒语与药水成功组合的数量。算法首先对药水数组排序,然后对每个咒语使用二分查找确定满足条件的最小药水强度。通过计算p_len - lower_bound位置,快速统计成功组合数。时间复杂度为O(mlogm + nlogm),其中m为药水数量,n为咒语数量。该方案通过预处理和二分查找优化了组合统计效率,适合大规模数据处理。示例验证了算法的正确性,同时指出了潜在的除零和精度问题及改进方向。

2025-12-07 22:40:08 963

原创 day117—二分查找—正整数和负整数的最大计数(LeetCode-2529)

摘要:本文提出一种高效算法,用于计算非递减数组中正数和负数的最大数量。通过两次二分查找(lower_bound),分别确定第一个≥0和≥1的位置,从而计算负数个数和正数个数。时间复杂度为O(logn),比线性扫描更高效。算法巧妙处理0值,并利用数组有序特性,示例演示了[-3,-2,0,0,1,2]的计算过程,结果为max(2,2)=2。该方法是二分查找的典型应用。

2025-12-07 11:00:00 299

原创 day116—二分查找—在排序数组中查找元素的第一个和最后一个位置(LeetCode-34)

摘要:本文提出了一种在非递减数组中查找目标值起止位置的高效算法。通过两次二分查找,分别定位目标值的左边界和右边界,确保时间复杂度为O(logn)。算法实现包含一个通用的lower_bound函数,用于查找第一个≥target的元素位置。searchRange函数通过调用lower_bound(target)和lower_bound(target+1)-1确定目标值的起止范围。若目标值不存在,则返回[-1,-1]。该方法比线性扫描更高效,适合处理大规模数据,如示例[5,7,7,8,8,10]查找8时正确返回[

2025-12-07 10:00:00 352

原创 双指针/滑动窗口—算法总结与教学指南

本文总结了双指针/滑动窗口算法的核心思想与应用技巧,主要包含三部分内容:1. 三种双指针模式(同向、对向、快慢指针)的特点与适用场景;2. 滑动窗口的通用解题框架与关键决策点(扩张/收缩时机、答案更新);3. 经典问题分类与教学建议。文章提供了详细的代码模板和问题识别技巧,并针对不同难度级别给出练习题路径,最后提炼出"右指针探索+左指针维持合法性+适时记录答案"的核心心法,帮助开发者系统掌握该算法范式。

2025-12-06 22:12:31 1564

原创 day115—同向双指针—将x减到0的最小操作数(LeetCode-1658)

摘要:该问题要求通过从数组两端移除元素使移除元素和等于x,求最小操作次数。解决方案转换为寻找中间和为total-x的最长子数组,采用滑动窗口算法实现。若找到该子数组,则最小操作次数为数组长度减去子数组长度;否则返回-1。算法时间复杂度为O(n),适用于大规模数据。示例验证了该方法的正确性。

2025-12-06 19:09:46 300

原创 day114—同向双指针(数组)—统计得分小于K的子数组数目(LeetCode-2302)

本文提出一种高效算法,用于统计数组中所有分数严格小于k的连续子数组数量。分数定义为子数组元素和乘以子数组长度。采用滑动窗口技术,维护一个满足条件的窗口[left, i],当窗口分数≥k时从左侧收缩窗口。关键点在于:1)当窗口分数满足条件时,窗口内所有以i结尾的子数组都满足条件;2)有效子数组数量等于窗口长度。算法时间复杂度为O(n),每个元素最多被处理两次。示例代码展示了该方法的实现,通过累加每个右端点i对应的有效子数组数量,最终返回总数。

2025-12-06 12:00:00 285

原创 day113—同向双指针(数组)—统计最大元素出现至少k次的子数组(LeetCode-2962)

摘要:该问题要求统计数组中至少包含k个最大元素的连续子数组数量。解决方案首先确定数组最大值,然后使用滑动窗口技术维护一个满足条件的窗口[left,i],其中最大值出现次数≥k。当窗口满足条件时,以当前右端点i结尾的有效子数组数量为left个。通过动态调整窗口边界并累加有效子数组数量,算法在O(n)时间内高效解决问题。示例中,输入[1,3,2,3,3]且k=2时,输出6个符合条件的子数组。

2025-12-06 11:00:00 545

原创 day112—同向双指针(数组)—最大连续1的个数(LeetCode-1004)

本文解决二进制数组中通过翻转最多k个0来获得最长连续1子数组的问题。采用滑动窗口法,维护一个包含不超过k个0的窗口[left, i],用zeroNum记录0的数量。当zeroNum超过k时,左指针移动到第一个0的下一位,保证窗口始终有效。时间复杂度为O(n),每个元素最多处理一次。例如,输入[1,1,1,0,0,0,1,1,1,1,0],k=2时,翻转两个0后得到长度为6的连续1子数组。核心思路是通过滑动窗口动态调整,确保窗口内0的数量始终≤k,从而高效找到最优解。

2025-12-06 10:00:00 217

原创 day111—同向双指针(字符串)—找到最长的半重复子字符串(LeetCode-2730)

本文研究字符串中的最长半重复子串问题。半重复子串定义为最多包含一对连续相同字符的子串。采用滑动窗口法,维护窗口[left,i]保证内部最多只有一对连续相同字符。当出现第二对时,收缩窗口跳过第一对,并重置计数。时间复杂度O(n),每个字符处理一次。算法通过移动窗口边界和计数变量sameNum来高效求解,最终返回最大窗口长度。例如输入"52233"输出4,对应子串"5223"。该方法能正确处理各种边界情况,如全相同字符时返回2。

2025-12-06 09:00:00 275

原创 day110—同向双指针(数组)—最多K个重复元素的最长子数组(LeetCode-2958)

本文提出了一种滑动窗口算法来寻找数组中满足所有元素出现频率不超过k的最长子数组。通过维护一个可变窗口[left, right],使用哈希表实时记录窗口内各元素的出现次数。当新元素加入导致某元素频率超过k时,从左侧收缩窗口直至重新满足条件。算法时间复杂度为O(n),每个元素最多被处理两次。示例代码展示了该方法的实现,使用unordered_map动态统计频率,在保证窗口合法的同时记录最大长度。该方法高效地解决了频率约束下的最长子数组问题。

2025-12-05 22:30:00 428

原创 day109—同向双指针(字符串)—每个字符最多出现两次的最长子字符串(LeetCode-3090)

摘要:本文介绍了一种滑动窗口算法,用于寻找字符串中每个字符最多出现两次的最长子串。通过维护一个窗口[left,i]和计数数组map,当新字符加入导致某个字符出现超过两次时,移动左边界缩小窗口。该算法时间复杂度为O(n),每个字符最多处理两次。示例输入"bcbbbcba"输出4,因其子串"bcbb"满足条件(实际为"bcbbcba"中符合条件的部分)。核心代码使用vector记录字符频率,在遍历时动态调整窗口并更新最大长度。

2025-12-05 22:15:00 402

原创 day108—同向双指针—乘积小于K的子数组(LeetCode-713)

本文介绍了一种计算乘积小于k的连续子数组数目的滑动窗口解法。当k≤1时直接返回0,否则维护一个乘积小于k的窗口[left,i]。每次右移i时,通过左移left保持乘积小于k,此时以i结尾的有效子数组数目为i-left+1。将所有右端点对应的数目累加即为答案。该算法时间复杂度为O(n),每个元素最多被处理两次。关键点在于利用滑动窗口性质确保每次计算都包含所有有效子数组。

2025-12-05 22:00:00 364

原创 day107—同向双指针—无重复字符的最长字串(LeetCode-3)

本文提出了一种滑动窗口算法来求解字符串中最长无重复字符子串的长度。算法使用长度为128的数组记录字符出现次数,通过维护左右边界指针left和i来动态调整窗口。当新字符导致重复时,左边界右移直至消除重复。时间复杂度为O(n),空间复杂度O(1)。该解法能正确处理所有ASCII字符组成的字符串,包括示例"abcabcbb"(输出3)、"bbbbb"(输出1)和"pwwkew"(输出3)等情况。

2025-12-05 21:30:00 315

原创 day106—双指针—长度最小的子数组(LeetCode-209)

摘要:该问题要求在给定正整数数组中找到长度最小的子数组,使其元素和≥目标值。采用滑动窗口算法,右指针扩展窗口求和,左指针在满足条件时收缩窗口以寻找最小长度子数组。时间复杂度为O(n),空间复杂度O(1)。示例显示算法能正确识别最短子数组,如[4,3]满足和≥7时长度为2。对于无法满足的情况返回0。

2025-12-05 17:12:15 202

原创 【Linux系统命令】——文件的权限命令

本文介绍了Linux文件权限管理的基本概念和操作方法。主要内容包括:1)文件所有权表示方法,通过第一个字母区分文件类型(d目录、l链接、-普通文件),后续9位三组rwx权限分别表示属主、属组和其他用户的权限;2)改变文件所有权的chown命令及其等效形式,以及专门修改属组的chgrp命令;3)修改文件权限的chmod命令的两种用法:字母表示法(如u-x)和数字表示法(八进制权限码)。文章通过具体示例说明了权限二进制与八进制的转换方法,以及不同命令形式的等效关系。

2025-12-03 21:58:23 258 1

原创 day105—对向双指针—给植物浇水(LeetCode-2105)

文章摘要:Alice和Bob同时从两端给一排植物浇水,Alice从左到右,Bob从右到左。当水不足时需要立即重新装满水罐。若相遇时水量相同,Alice优先浇水。解决方案使用双指针模拟浇水过程,统计重新装满水罐的次数。关键点包括相遇时的水量比较以及及时补充水量的处理。算法时间复杂度为O(n),空间复杂度为O(1)。

2025-11-29 22:30:00 657

原创 day104—对向双指针—接雨水(LeetCode-42)

摘要:本文提出了两种解决"接雨水"问题的算法。第一种方法使用动态规划,预先计算每个位置的左右最大高度,然后计算每个位置能接的雨水量(左右最大高度的较小值减去当前高度)。第二种方法采用双指针优化,通过维护左右指针和当前左右最大高度,在遍历过程中动态计算雨水量。两种方法的时间复杂度均为O(n),但双指针法将空间复杂度从O(n)优化到O(1)。示例输入[0,1,0,2,1,0,1,3,2,1,2,1]输出6个单位雨水。

2025-11-29 22:00:00 342

原创 day103—双指针—盛最多水的容器(LeetCode-11)

本文解决了在给定高度数组中找到两条垂直线构成最大容水面积的问题。采用双指针法,初始化左右指针分别指向数组两端,通过计算当前面积并移动较短边的指针来逐步逼近最优解。时间复杂度为O(n),空间复杂度为O(1)。示例输入[1,8,6,2,5,4,8,3,7]输出49,验证了算法的正确性。该方法高效地处理了大规模数据,适用于n≤10^5的情况。

2025-11-29 14:52:48 160

原创 day102—双指针—四数之和(LeetCode-18)

本文提出了一种寻找四数之和等于目标值的算法。通过排序数组后使用双重循环加双指针的方法,首先固定前两个数,然后用双指针在剩余部分寻找符合条件的组合。算法包含去重处理,通过跳过重复元素确保结果不重复。时间复杂度为O(n³),空间复杂度为O(1)。示例验证了算法在给定输入下能正确输出所有符合条件的四元组。

2025-11-29 12:00:00 240

原创 day101—双指针—有效三角形的个数(LeetCode-611)

摘要:该问题要求统计数组中能构成三角形的三元组个数。解决方法是先排序数组,然后使用双指针法:固定最大边作为第三边,检查是否存在两边之和大于该边。具体实现中,从数组末尾开始遍历,设定左右指针,当两数之和大于第三边时,统计所有可能的组合。时间复杂度为O(n²),空间复杂度为O(1)。该方法有效避免了a+b=c的歧义情况,确保正确统计所有满足三角形不等式的三元组。

2025-11-29 00:09:32 165

原创 day100—双指针—最接近的三数之和(LeetCode-16)

摘要:该算法解决在给定整数数组中找到三个数,使其和最接近目标值的问题。通过先排序数组,然后固定一个数,使用双指针法遍历剩余元素,计算三数之和并与目标值比较。通过维护最小差值和当前最优解来优化搜索过程,最终返回最接近目标值的和。时间复杂度为O(n²),适用于数组长度在1000以内的场景。

2025-11-28 12:39:07 299

原创 day99—双指针—统计 和值 小于目标的下标对数目(LeetCode-2824)

摘要:本文提出了一个双指针算法来解决数组中满足两数之和小于目标值的下标对计数问题。首先对数组排序,然后使用双指针技术(左指针初始为0,右指针初始为n-1)高效统计满足条件的下标对。当nums[x]+nums[y]<target时,直接计算并累加满足条件的对数,否则移动右指针。该方法避免了暴力枚举,时间复杂度为O(nlogn)(排序)+O(n)(双指针遍历),空间复杂度为O(1)。示例验证了算法的正确性。

2025-11-28 11:29:57 403

原创 day98—双指针—三数之和(LeetCode-15)

摘要:本文解决寻找数组中所有不重复三元组使其和为0的问题。通过先对数组排序,固定一个元素后使用双指针法寻找另外两个元素。关键步骤包括跳过重复元素以避免重复解,以及根据当前和调整指针位置。时间复杂度为O(n²),适用于长度不超过3000的数组。示例表明该方法能正确识别有效三元组并排除重复解。

2025-11-27 23:46:37 168

原创 【笔试面试】—手撕代码—用C++ 11实现线程池

【笔试面试】—手撕代码—用C++ 11实现线程池

2025-11-17 13:52:03 135

原创 day97—滑动窗口—无重复字符的最长字串(LeetCode-3)

给定一个字符串s,请你找出其中不含有重复字符的的长度。3因为无重复字符的最长子串是 "abc",所以其长度为 3。注意 "bca" 和 "cab" 也是正确答案。1因为无重复字符的最长子串是 "b",所以其长度为 1。3因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是的长度,"pwke" 是一个子序列,不是子串。

2025-11-09 08:03:43 138

原创 【笔试面试】—手撕代码—智能指针的实现原理

本文实现了一个基于引用计数机制的智能指针shared_ptr。通过shareCount类管理对象的引用计数,包含构造、析构、引用计数增减等功能。shared_ptr类实现拷贝构造、移动构造、运算符重载等方法,支持指针的共享所有权和资源自动释放。测试案例验证了指针共享、重置、移动语义等功能,当引用计数归零时自动释放资源。该实现避免了内存泄漏,通过移动构造实现高效资源转移,展现了智能指针的核心原理。

2025-11-02 11:32:51 190

原创 day96—双指针—长按键入(LeetCode-925)

摘要:本文解决键盘输入可能被长按导致字符重复的问题。通过双指针方法,比较name和typed字符串:当字符匹配时移动双指针;不匹配时跳过typed中的重复字符。最终需要确保name所有字符都被匹配,且typed剩余字符均为重复。时间复杂度O(n+m),空间复杂度O(1)。例如"alex"与"aaleex"匹配成功,而"saeed"与"ssaaedd"匹配失败。

2025-11-01 17:03:28 340

空空如也

空空如也

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

TA关注的人

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