- 博客(341)
- 收藏
- 关注
原创 代码训练LeetCode(30)最长公共前缀
题目要求从一个由若干单词组成的字符串中找出最后一个单词的长度。这里的单词是指连续的字母字符序列,单词之间由一个或多个空格分隔。重点在于处理字符串前后以及单词间可能存在的多余空格。
2025-06-11 20:44:20
106
1
原创 代码训练LeetCode(29)最后一个单词的长度
题目要求从一个由若干单词组成的字符串中找出最后一个单词的长度。这里的单词是指连续的字母字符序列,单词之间由一个或多个空格分隔。重点在于处理字符串前后以及单词间可能存在的多余空格。
2025-06-11 20:42:15
200
原创 代码训练LeetCode(28)罗马数字
本题目要求将一个给定的罗马数字字符串转换为对应的整数值。罗马数字使用七个基本符号(I, V, X, L, C, D, M)进行表示,不同的符号组合表示不同的数值,而且有特定的规则来表示特定的数值,如 IV 表示 4,IX 表示 9 等。罗马数字是由七种基本符号构成,每种符号对应一个基本的数值。通常情况下,小的数字放在大的数字右边,表示这些值的累加。然而,如果小的数字放在大的数字左边,则表示大的数减去小的数。这种特例仅限于几种特定的组合。
2025-06-10 21:55:52
797
原创 代码训练LeetCode(27)接雨水
本题目要求将一个给定的罗马数字字符串转换为对应的整数值。罗马数字使用七个基本符号(I, V, X, L, C, D, M)进行表示,不同的符号组合表示不同的数值,而且有特定的规则来表示特定的数值,如 IV 表示 4,IX 表示 9 等。罗马数字是由七种基本符号构成,每种符号对应一个基本的数值。通常情况下,小的数字放在大的数字右边,表示这些值的累加。然而,如果小的数字放在大的数字左边,则表示大的数减去小的数。这种特例仅限于几种特定的组合。
2025-06-10 21:54:50
1043
原创 代码训练LeetCode(26)分发糖果
这道题目要求是给一排孩子分配糖果,每个孩子至少要有一个糖果。如果一个孩子的评分比他相邻的孩子高,那么这个孩子需要得到比相邻孩子更多的糖果。我们的目标是计算出满足这些条件的情况下,需要的最少糖果数量。
2025-06-09 22:51:51
362
1
原创 代码训练LeetCode(25)加油站
这道题目要求是给一排孩子分配糖果,每个孩子至少要有一个糖果。如果一个孩子的评分比他相邻的孩子高,那么这个孩子需要得到比相邻孩子更多的糖果。我们的目标是计算出满足这些条件的情况下,需要的最少糖果数量。
2025-06-09 22:51:02
686
原创 代码训练LeetCode(24)数组乘积
本文探讨了LeetCode中数组乘积问题的解法。题目要求计算数组中每个元素除自身外其他元素的乘积,且不能使用除法。作者分析采用左右乘积数组的方法:先构建左积数组记录每个元素左侧所有元素的乘积,再构建右积数组记录右侧乘积,最后将两者相乘得到结果。通过优化,空间复杂度可降至O(1)。代码实现展示了如何先用输出数组存储左积,再利用变量动态计算右积进行优化。该解法时间复杂度为O(n),适用于大规模数据,体现了对数组操作的巧妙处理。
2025-06-05 22:39:34
1029
3
原创 代码训练LeetCode(23)随机访问元素
本文介绍了如何在O(1)时间复杂度下实现插入、删除和随机访问元素的数据结构。通过结合哈希表(快速查找)和动态数组(随机访问)的优势,构建了一个高效的RandomizedSet类。关键点在于:插入时将元素追加到数组末尾并记录索引;删除时用末尾元素覆盖目标位置并更新索引;随机访问直接通过数组下标实现。该方案满足所有操作的平均时间复杂度为O(1)的要求,适用于高频数据操作场景。
2025-06-05 22:38:00
1393
原创 代码训练LeetCode(22)研究者H指数
摘要: 本文探讨LeetCode上H指数问题的解法。H指数定义为研究者至少有h篇论文被引用h次以上。通过排序引用次数数组(如使用qsort),然后从后向前遍历寻找满足条件的最大h值。关键步骤包括排序(O(n log n))和单次遍历(O(n))。代码实现展示了具体逻辑,强调将实际问题抽象为算法的重要性,建议通过类似练习提升算法思维。适用于学术评价或数据分析场景。 (共146字)
2025-06-04 22:01:03
564
1
原创 代码训练LeetCode(21)跳跃游戏2
本文介绍了LeetCode中"跳跃游戏2"问题的贪心算法解决方案。该问题要求在给定数组中,从起点到终点的最小跳跃次数。通过维护当前跳跃边界和最远可达位置,遍历数组时动态更新这两个变量,并在到达边界时增加跳跃次数。该方法时间复杂度为O(n),空间复杂度O(1)。文章提供了C语言实现代码,并强调了贪心算法在解决这类优化问题中的有效性。掌握该算法有助于提升解决类似问题的能力。
2025-06-04 22:00:19
595
原创 代码训练LeetCode(20)跳跃游戏
本文介绍了LeetCode中"跳跃游戏"问题的贪心算法解决方案。通过维护一个maxReach变量记录当前可到达的最远位置,遍历数组时更新该值。若发现某位置无法到达则返回false,否则最终检查maxReach是否能覆盖数组末尾。该方法时间复杂度O(n),空间复杂度O(1),示例代码展示了C语言实现。该问题展现了贪心算法在局部最优选择带来全局最优的特性,适合处理类似的数组遍历问题。
2025-06-03 23:16:04
445
1
原创 代码训练LeetCode(19)轮转数组
摘要: 文章探讨了LeetCode轮转数组问题的三种解法:使用额外数组、多次反转和环状替换,重点分析了多次反转法的实现。该方法通过三次反转(整体、前k个、剩余部分)实现数组右旋k位,时间复杂度O(n),空间复杂度O(1)。代码示例展示了C语言实现,强调原地操作的高效性。总结指出该问题锻炼数组操作和算法设计能力,特别是原地算法的优化思路,对提升编程能力有重要意义。
2025-06-03 23:15:06
836
原创 RPM之(1)基础使用
本文介绍了Linux系统下RPM(Red Hat Package Manager)包管理器的基础使用和实践方法。主要内容包括: RPM的发展背景和核心特性,如依赖管理、数字签名验证、软件包数据库等。 RPM包的命名格式详解:name-version-release.architecture.rpm,以及特殊包类型说明。 常见RPM命令操作: 安装/升级/卸载软件包 查询包信息/文件列表 查看文件所属包 RPM包构建实践: 安装必要工具(rpmbuild等) 创建标准构建目录结构 使用脚本自动生成SPEC文件
2025-05-26 23:53:26
840
13
原创 C++之fmt库介绍和使用(3)
本文介绍了C++中fmt库的格式化语法,重点关注格式字符串的替换字段和格式说明符的用法。替换字段通过大括号{}包围,可以包含参数ID和格式说明符,用于指定参数的显示格式。格式说明符定义了字段宽度、对齐方式、填充字符、符号显示、精度等细节。文章详细说明了各种格式化选项的含义和使用场景,包括对齐、符号、填充、宽度、精度和类型等。此外,还介绍了不同类型(如整数、字符、字符串等)的格式化选项及其效果。通过这些语法规则,开发者可以灵活地控制输出的格式,满足不同的显示需求。
2025-05-23 21:40:28
967
7
原创 C++之fmt库介绍和使用(2)
本文介绍了C++中fmt库的格式化API及其使用。fmt/format.h提供了丰富的格式化功能,包括字符串格式化、指针和枚举值的处理、数字分组、系统错误处理以及自定义内存分配器。文章详细讲解了fmt::format、fmt::ptr、fmt::underlying等实用函数,并展示了如何通过fmt::memory_buffer进行动态内存管理。此外,还介绍了如何通过'L'格式说明符实现区域设置相关的数字格式化,并支持自定义分配器以满足特定需求。fmt库以其高效、灵活的特性,成为C++中处理格式化的强大工具
2025-05-20 21:14:22
1882
39
原创 c++(6)function与成员函数
本文介绍了C++中的std::function及其与成员函数的使用。std::function是C++11引入的通用多态函数封装器,能够封装各种可调用对象(如普通函数、lambda表达式、仿函数、成员函数等),提供统一的调用接口,增强代码的灵活性和泛用性。通过std::function,不同类型的可调用对象可以用相同的方式调用,简化了代码设计。文章还探讨了std::function的实现原理,即通过类型擦除技术将不同类型的可调用对象抽象为统一的调用接口,并介绍了其与函数指针、lambda表达式、仿函数等的区
2025-05-18 20:47:31
904
9
原创 C++之fmt库介绍和使用(1)
本文介绍了C++中的fmt库,一个现代化的格式化库,旨在替代传统的iostream和printf方法。fmt库由Victor Zverovich开发,具有安全性、可扩展性、高性能、Unicode支持、快速编译、小二进制体积、可移植性和开源等特点。文章详细列举了fmt库的主要特性,并提供了性能对比数据,显示fmt库在速度和效率上优于其他常见格式化方法。此外,文章还介绍了fmt库的编译时间和代码膨胀测试结果,进一步证明了其高效性。通过简单的代码示例,展示了如何使用fmt库进行文本格式化输出。
2025-05-14 20:57:00
2310
50
原创 研发效率破局之道阅读总结(5)管理文化
《研发效率破局之道》第五部分探讨了管理文化在提升团队研发效能中的关键作用。文章指出,管理是提高团队效能的基石,而文化则是持久高效的保障。技术管理者的主要任务包括寻找目标、目标管理以及计划执行。目标管理应遵循SMART原则,并利用OKR工具进行目标对齐。在任务执行上,管理者需从人、流程和工具三方面入手,激发团队成员的主观能动性。文化建设方面,文章强调了文化作为潜规则的重要性,并提出了推动文化建设的三个要点:坚持行动、明确价值观和注意文化演进。
2025-05-10 22:55:18
1142
7
原创 研发效率破局之道阅读总结(4)个人效率
Author: Once Day Date: 2025年4月30日一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…漫漫长路,有人对你微笑过嘛…
2025-04-30 21:50:11
1853
35
原创 Linux之netlink(2)libnl使用介绍(1)
Author:Onceday Date:2025年4月26日漫漫长路,才刚刚开始…全系列文章可查看专栏:Linux内核知识_Once-Day的博客-CSDN博客libnl3是Linux平台上一个功能丰富的网络编程库。它为用户空间程序提供了一组全面的API,用于与Linux内核的网络组件进行交互。libnl3让开发者能够方便地配置和管理各种网络功能,如链路、接口、路由、地址、邻居、策略路由、流量控制、网络状态监控等。
2025-04-26 23:39:14
1277
7
原创 研发效率破局之道阅读总结(3)工程优化
蓝绿部署(Blue-green Deployment)、红黑部署(Red-black Deployment)和灰度发布(Gray Release ,或 Dark Launch)的定义和流程:(1)蓝绿部署,是采用两个分开的集群对软件版本进行升级的一种方式。它的部署模型中包括一 个蓝色集群 A 和一个绿色集群 B,在没有新版本上线的情况下,两个集群上运行的版本是 一致的,同时对外提供服务。首先,从负载均衡器列表中删除集群 A,让集群 B 单独提供服务。然后,在集群 A 上部署新版本。
2025-04-22 22:32:04
1621
40
原创 程序性能(1)嵌入式基准测试工具
它由EEMBC(Embedded Microprocessor Benchmark Consortium)开发,测试内容包括常见的处理器操作,如整数运算、矩阵操作、状态机等,通过运行一系列测试并计算总分来衡量处理器性能。可以看出,该设备顺序读写性能在1.1-1.5 GB/s左右,随机读写略高一些,达到了1.3~1.7 GB/s。处理器缓存大小设置为1024 kB,处理器缓存行大小设置为32字节,文件Stride大小设置为记录大小的17倍。测试结果的单位为kBytes/sec,即每秒传输的KB数。
2025-04-19 21:33:32
1124
13
原创 研发效率破局之道阅读总结(2)流程优化
方法论实施效果不好,关键在于没用好。在学习方法论的时候,我推荐使用类似美国著名作家、企业顾问西蒙斯 · 涅克(Simon Sinek)总结的 Why-How-What 黄金圈法则。参见下图:最中间的一个圆是 Why,也就是这个方法论的目标,是要解决一个什么问题; 第二个圆是 How,也就是这个方法论的基本原则、指导思想;最外层的圆是 What,也就 是这个方法论的具体实践。在使用一个方法论的时候,一定要从内往外看。中心的目标一般错不了。比如,敏捷的目标就是快速应对变化。原则的通用性就差一些,你需要在理解的基
2025-04-15 22:18:07
1557
34
原创 React(1)基础入门
React是一个用于构建用户界面的流行JavaScript库。它由Facebook开发,于2013年5月开源。声明式编程模型:React允许用声明式的方式描述用户界面,当状态变化时,React会高效地更新UI。基于组件:React鼓励创建可复用的UI组件,让代码易于复用和维护。一个React应用通常由多个组件嵌套组成。虚拟DOM:React使用Virtual DOM来提升性能。
2025-04-14 00:07:11
1257
14
原创 研发效率破局之道阅读总结(1)研发效能
研发团队看起来人也不少,大家也很辛苦,加班也不少了,但是产品发布还是常常延期,上线后产品问题频发。用户需求从需求分析、产品设计、开发、测试最终流到部署,但最终发布的产品与用户需求偏差却很大。产品发布上线时出现大量提交、合并,导致最后时刻出现很多问题,团队成员集体熬夜加班,却将大把的时间花在了等待环境、等待验证上。开发提测质量不好,大量压力聚集到测试这一步,导致代码返工率很高。引入单元测试、代码审查,效果却都不明显。
2025-04-08 22:29:37
1206
37
原创 Linux错误(6)X64向量指令访问地址未对齐引起SIGSEGV
X64设备上,如果定义一个结构体,其包含连续的整数字段,并且存在类似的算术操作,编译会自动优化代码,生成向量指令SSE/AVX(xmm0),但是由于这些结构体的地址没有对齐到16字节,读取数据时会触发SIGSEGV错误,造成coredump。/* 禁止内联 */// data128_add函数二进制反汇编如下GDB调试运行结果如下,可以清晰看到执行的指令、代码行和数据地址信息:/* 禁止内联 */// -O3 编译会生成如下代码// 申请一段内存, 64字节。
2025-04-04 22:45:33
1199
8
原创 C之(16)scan-build与clang-tidy使用
Clang是一个由Apple主导开发的开源编译器前端项目,旨在提供一个现代化、高效、易于使用和可扩展的编译器工具链。Clang项目的主要目标是为C、C++、Objective-C等编程语言提供更好的编译支持,同时与底层的LLVM编译器基础设施紧密集成。Clang采用模块化的架构设计,将编译过程分为词法分析、语法分析、语义分析、代码生成等多个阶段,每个阶段都有相应的库和工具来处理。这种模块化的设计使得Clang易于理解、维护和扩展,开发者可以方便地为Clang添加新的功能或优化现有功能。
2025-03-30 18:39:37
1624
42
原创 内存检查之Valgrind工具
Valgrind是一个功能强大的开源动态分析工具,主要用于检测和调试C/C++程序中的内存管理和线程同步问题。它最初由Julian Seward在2000年开发,旨在帮助程序员发现难以捕捉的bug,特别是那些与内存相关的错误,如内存泄漏、越界访问、使用未初始化的内存等。经过多年的发展和完善,Valgrind已经成为了业界广泛使用的调试工具之一。它不仅支持Linux,还可以在macOS和Android等平台上运行。
2025-03-26 21:48:33
1410
38
原创 C之(15)cppcheck使用介绍
Cppcheck是一款静态代码分析工具,专门用于检查C/C++代码中潜在的错误和漏洞。它由瑞典程序员Daniel Marjamäki在2007年开发,旨在帮助开发者提高代码质量,减少bug。Cppcheck的诞生源于Daniel在工作中遇到的一些棘手的编程问题。他发现,许多C/C++项目中存在许多常见的编码错误,如内存泄漏、未初始化变量、数组越界等,这些问题不易被发现,但却可能导致程序崩溃或产生安全隐患。为了解决这一痛点,Daniel利用业余时间开发了Cppcheck。
2025-03-23 22:19:25
2422
49
原创 Git(12)GitLab持续集成(CICD)
Continuous Integration (CI) 持续集成:假设一个应用程序,其代码存储在GitLab的Git仓库中。开发人员每天都要多次推送代码更改。对于每次向仓库的推送,都可以创建一组脚本来自动构建和测试你的应用程序,从而减少了向应用程序引入错误的机会。Continuous Delivery (CD) 持续交付:应用程序不仅会在推送到代码库的每次代码更改时进行构建和测试,而且,尽管部署是手动触发的,但作为一个附加步骤,它也可以连续部署。
2025-03-20 21:43:20
2042
36
原创 Linux错误(2)程序触发SIGBUS信号分析
SIGBUS是BUS error的缩写,中文称为总线错误信号。它是Unix/Linux系统中的一种异常信号,通常在访问内存时发生某些类型的错误时产生。地址对齐错误(Alignment Fault):当访问的内存地址不满足硬件的对齐要求时触发。例如在需要4字节对齐的系统上访问一个地址不是4的倍数的int变量。未映射的物理地址访问:试图访问未映射到任何设备的物理地址空间时会触发SIGBUS。这可能是由错误的指针运算或直接访问物理内存导致的。特定于设备的硬件错误。
2025-03-17 23:03:07
1490
37
原创 系统可观测性(5)OpenTelemetry基础使用
OpenTelemetry是一个开源的、独立于供应商的遥测数据收集和管理框架,旨在帮助实现系统的可观测性。它为创建和管理追踪、指标和日志等遥测数据提供了一套标准化的工具和API。
2025-03-14 20:25:06
1309
11
原创 Linux错误(5)程序fork子进程后访问内存触发缺页中断(COW)
在一个多线程程序中,使用popen()创建子进程后,系统出现了大量缺页中断(Page Fault),导致瞬间突发耗时(约 50ms)。由于popen()本质上调用了fork(),而fork()在多线程环境下可能会触发写时拷贝(Copy-On-Write, COW),进而导致内存页复制,引发性能抖动。是创建子进程并执行新程序的高效方法,通常用于替代组合。避免fork()继承大量地址空间,减少写时拷贝(COW)和缺页中断。实现方式因系统不同,在Linux,可能使用vfork()进行优化。在macOS,
2025-03-12 21:14:23
2797
34
原创 Linux之kernel(1)系统基础理论(6)
Author: Once Day Date: 2025年3月10日一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…漫漫长路,有人对你微笑过嘛…
2025-03-10 23:15:36
1680
38
原创 Linux之kernel(1)系统基础理论(5)
内存管理是操作系统的核心功能之一,其主要目标是支持多个应用程序同时运行,并提供内存保护和重定位机制。内存保护确保各个应用程序之间相互隔离,防止非法访问;而重定位使得程序可以在内存中自由移动,而无需修改代码。操作系统引入了地址空间的抽象概念。每个进程都拥有独立的虚拟地址空间,其中包含了代码、数据、堆栈等区域。这种抽象屏蔽了物理内存的细节,简化了程序的编写和内存管理。程序可以在自己的地址空间内自由访问,而不必关心具体的物理内存分配。为了实现地址空间的映射和转换,硬件芯片提供了基址寄存器和变址寄存器。
2025-03-05 00:04:03
935
13
原创 linux之crosstool-NG(1)生成toolchain
Crosstool-NG 是一款用于建立交叉编译器的开源工具。交叉编译器是一种特殊类型的编译器,可以在一种类型的计算机上(称为“主机”)为另一种类型的计算机(称为“目标”)生成可执行代码。这对于嵌入式系统开发者特别有用,他们需要在功能强大的主机上为资源受限的目标设备(如 ARM 或 MIPS 微控制器)生成代码。自定义构建: Crosstool-NG 允许用户选择他们想要的特定版本的 GCC,glibc 和 binutils,以及其他的库和工具。这意味着你可以根据项目需求创建一个精细调整的工具链。
2025-02-28 01:14:02
2846
53
原创 linux之perf(17)PMU事件采集脚本
perf是 Linux 内核提供的性能分析工具,用于监控和分析 CPU、缓存、内存、I/O 等系统性能指标。常用于统计 CPU 使用情况,分析函数调用热点(热点分析),监测硬件事件(如缓存未命中、指令执行),发现性能瓶颈。perf stat是perf的子命令,用于统计系统或进程的性能指标,比如指令执行数、CPU 时钟周期、缓存未命中等。选项作用-e <event>指定监测的事件(如cycles-a监视整个系统-C <cpu>监视指定 CPU-p <pid>监视指定进程-I <ms>每ms。
2025-02-22 21:52:16
2470
51
原创 easelog(1)基础C++日志功能实现
(1) 支持日志级别分类:DEBUG、INFO、WARNING、ERROR,可选支持FATAL。(2) 输出信息类别:时间戳、进程ID、线程ID、函数名、代码行号和日志信息(支持不定参数)。(3) 支持多线程:要求时间戳不能乱序,性能方面没有特别要求。
2025-02-22 21:49:16
1061
5
原创 系统可观测性(4)SRE实践思考(矢量比特)读书总结
自动化的的建设一定要敢想,想后马上行动,不能像做菜一样等着所有的材料都备齐了才下锅,最重要的是快速行动起来,有了最小雏形后小心求证、快速迭代、小步快跑。
2025-02-19 20:29:49
1197
33
原创 Linux之kernel(1)系统基础理论(4)
进程和线程是操作系统中两个基本的执行单位。进程是资源分配的基本单位,而线程是CPU调度的基本单位。每个进程都有自己独立的地址空间、文件资源、内存资源等,而一个进程中可以包含多个线程,这些线程共享进程的资源,但每个线程有自己独立的运行栈和程序计数器。为了让系统中多个进程和线程能够有序地执行,操作系统需要对它们进行调度。调度的目的是为了提高系统的效率,合理利用系统资源,让各个进程和线程都能够获得执行的机会。先来先服务(FCFS):按照进程到达就绪队列的先后顺序来调度,先来的进程先执行。
2025-02-19 20:21:55
1102
2
Autotool Tutorial(epita.fr) - Autorools使用教程PDF文档
2023-12-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人