2024.06.21 刷题日记 101. 对称二叉树判断是否对称,检查 root->left->val == root->right->val,接着进行递归检查对称位置: 12345678910111213141516171819class Solution {public: // 传入对称位置的两个对称位置 bool isMirror(TreeNode* left 2024-06-21 LeetCode #算法 #数据结构 #leetcode
2024.06.20 刷题日记 2. 两数相加这道题目的思路就是模拟,好处是逆序的,不用反转链表: 1234567891011121314151617181920212223242526272829ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { // 创建一个新的链表节点,作为返回结果的头节点 ListNode* dummyHead 2024-06-20 LeetCode #算法 #数据结构 #leetcode
2024.06.19 刷题日记 41. 缺失的第一个正数这个题目的通过率很低,是一道难题,类似于脑筋急转弯,确实不好想。实际上,对于一个长度为 N 的数组,其中没有出现的最小正整数只能在 [1,N+1] 中。 这个结论并不好想,举个例子:nums = [3,4,-1,1],长度为 4,未出现的最小正数是 2;极端一点,nums = [1,2,3,4],未出现的最小正数是 5。因此算法的第一步就是预处理,将这个范围之外的数全部 2024-06-19 LeetCode #算法 #数据结构 #leetcode
2024.06.18 刷题日记 76. 最小覆盖子串这道题目的思路是利用哈希表来存储字符串的字符出现的频率,然后利用滑动窗口来确定是否包含目标串,如果没有包含,就继续滑动右指针。当子串已经包含的时候,就收缩窗口,更新答案,以及右移 left。 12345678910111213141516171819202122232425262728293031323334353637383940414243class Solution 2024-06-18 LeetCode #算法 #数据结构 #leetcode
2024.06.17 刷题日记 42. 接雨水这道题的关键点是基于贪心策略,同时设置双指针,left_max 追踪左边的最大值 height[left],right_max 同理。如果 height[left] < height[right],那么就可以收集雨水,雨水量为 water += left_max - height[left],同时右移左指针;反之同理: 1234567891011121314151 2024-06-18 LeetCode #算法 #数据结构 #leetcode
2024.06.16 刷题日记 前言今天刷了大概两个半小时,一边刷一边学,一边吃零食。效率有点低了~ 以后每天都会刷,并且写刷题日记,题目标题有题目序号以及题目名称,方便以后查询。 1. 两数之和重点是要降低时间复杂度,所以用哈希表了,由于不能重复出现,所以是先查询后插入: 12345678910111213141516class Solution {public: vector<int> two 2024-06-16 LeetCode #算法 #数据结构
mmap() 的几种用法 〇、前言mmap 是一个非常强大的系统调用,常用于映射文件到内存中,以实现快速和方便的文件访问,也用于进程间通信等多种场景。下面是一些 mmap 的常见用法: 1. 文件映射(Memory-mapped files)文件映射是 mmap 最直接的用途之一,可以将整个文件或文件的一部分映射到进程的地址空间。这允许程序像访问普通内存那样访问文件数据,可以提高文件操作的性能,特别是对于大文件的随机访 2024-06-12 OS > 系统编程 > Unix/Linux #系统调用 #mmap #文件
debugger(七):栈帧(backtrace) 〇、前言在前面已经详细得介绍了栈帧,这里实现 backtrace。 一、backtrace思路是遍历 stack,搜索 stack pointer,逐个打印栈帧信息,一直打印到 main 函数。 12345678910111213141516171819void Debugger::print_backtrace() { auto output_frame = [frame_n 2024-06-11 系统编程 > C++ > debugger #c++ #debugger
debugger(六):source level 断点 〇、前言前面一直使用 break 0xADDR 来打断点,这种打断点的方式及其不方便,需要手动获取某一行的断点,这一节的目标是采用以下方式打断点: 123456// 函数名break main// 源代码break main.cpp:10// 地址break 0xADDR 一、break 函数名这个可以在所有的编译单元中搜索。对于每一个 cu,只需要判断:(die.has(dwarf::DW 2024-06-11 C++ debugger #c++ #lldb #debugger
debugger(五):source level stepping 〇、前言前面的源代码打印,利用了 DWARF 格式化的信息,现在我们更进一步,利用它分别进行 stepi、step_over、step_in、step_out。 一、stepi这个最简单,我们只需要利用 ptrace 就行: 1234567891011121314151617181920212223242526void Debugger::single_step_instruction() & 2024-06-11 系统编程 > C++ > debugger #c++ #lldb #debugger