Hot100方法及易错点总结2

本文旨在记录做hot100时遇到的问题及易错点

  • 五、
    • 234.回文链表
    • 141.环形链表
  • 六、
    • 142. 环形链表II
    • 21.合并两个有序链表
    • 2.两数相加
    • 19.删除链表的倒数第n个节点
  • 七、
    • 24.两两交换链表中的节点
    • 25.K个一组翻转链表(坑点很多,必须多做几遍)
    • 138.随机链表的复制
    • 148.排序链表
  • New
    • 23.合并k个升序链表(看懂未做)
    • 146.LRU缓存(未做)
    • 二叉树的中序遍历
    • 104.二叉树的最大深度
    • 226.翻转二叉树
    • 101.对称二叉树
    • 543. 二叉树的直径
    • 102.二叉树的层序遍历(看懂未做)
    • 108.将有序数组转换为二叉搜索树(看懂未做)
    • 98.验证二叉搜索树(看懂未做)
    • 230.二叉搜索树中第k小的元素(有思路未做)
    • 199.二叉树的右视图(看懂未做)
    • 114.二叉树展开为链表(看懂未做)
    • 105.从前序与中序遍历序列构造二叉树(看懂未做)

五、

234.回文链表

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public boolean isPalindrome(ListNode head) {if(head==null)return false;if(head.next==null)return true;int count=0;ListNode fast=head;ListNode slow=head;while(fast!=null&&fast.next!=null){fast=fast.next.next;slow=slow.next;//slow就是中间开始的第一个元素,不论是奇数还是偶数,他都是第一个元素}ListNode p=head;while(p.next!=slow){p=p.next;}//循环结束后p.next=middle;p.next=null;//前后断开才行//后半部分用尾插法ListNode reverse=new ListNode(0);ListNode q=slow;while(slow!=null){q=slow;slow=slow.next;q.next=reverse.next;reverse.next=q;}//逆序后,第二个链表的元素是reverse.nextListNode head2=reverse.next;while(head!=null&&head2!=null){if(head.val!=head2.val){return false;}head=head.next;head2=head2.next;}return true;}
}
1.易错点:前半部分和后半部分需要断开
2.还是翻转链表的问题
3.
while(slow!=null){q=slow;slow=slow.next;q.next=reverse.next;reverse.next=q;}
//循环变量是slow,不能写成q啊,这个笔误真讨厌
4. while(fast!=null&&fast.next!=null){fast=fast.next.next;slow=slow.next;//slow就是中间开始的第一个元素,不论是奇数还是偶数,他都是第一个元素}

141.环形链表

这次竟然没费什么周折直接做出来了,果然第二遍做题就是不一样

1.A和B一起跑步,AB快,如果A能和B相遇,那一定是AB多跑了n圈
/*** Definition for singly-linked list.* class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public boolean hasCycle(ListNode head) {//当fast和slow第一次相等的时候,fast比slow多跑了一圈,ListNode fast=head;ListNode slow=head;while(fast!=null&&fast.next!=null){fast=fast.next.next;slow=slow.next;if(fast==slow){return true;}}return false;}
}

六、

142. 环形链表II

思路:
1.设快指针走的步数是f,慢指针走的步数是s,f=2s
当快慢指针第一次相遇的时候,(f-a)=(s-a)+nb ,快指针在环上套圈了b
综合求得到s=nb
2.到达环入口的节点(示例中图1)走的长度为a+nb, 第一次相遇时b走了nb,所以b再走a步就到入口,同时另一个指针每次走一步,走a步也到入口。

在这里插入图片描述

/*** Definition for singly-linked list.* class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode detectCycle(ListNode head) {ListNode fast=head;ListNode slow=head;int flag=0;while(fast!=null&&fast.next!=null){fast=fast.next.next;slow=slow.next;if(fast==slow){//此刻slow走了nbfast=head;while(fast!=slow){fast=fast.next;slow=slow.next;}return slow;}}return null;   }
}

21.合并两个有序链表

一道常规题,p和q写的时候要注意,不能把p写成q,这样会陷入死循环,眼花找不出错误。
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode p=list1;ListNode q=list2;ListNode L=new ListNode(0);ListNode l=L;while(p!=null&&q!=null){if(p.val<q.val){l.next=p;l=l.next;p=p.next;}else{l.next=q;l=l.next;q=q.next;}}while(p!=null){l.next=p;l=l.next;p=p.next;}while(q!=null){l.next=q;l=l.next;q=q.next;   }return L.next;}
}

2.两数相加

1.不能先将两数用int保存下来,然后再计算,这样不仅效率不高,而且如果数字过大,超过了int的取值范围,会有数值溢出的风险
2.看清楚题目,数字的最高位在链表的末尾的!!,可以用进位解决
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {int carry=0;ListNode L=new ListNode(0);//尾插法的头节点ListNode l=L;while(l1!=null&&l2!=null){ListNode p=l1;ListNode q=l2;l1=l1.next;l2=l2.next;int tmp=(p.val+q.val+carry)%10;carry=(p.val+q.val+carry)/10;ListNode tmpnode=new ListNode(tmp);l.next=tmpnode;l=l.next;}while(l1!=null){ListNode p=l1;l1=l1.next;int tmp=(p.val+carry)%10;carry=(p.val+carry)/10;ListNode tmpnode=new ListNode(tmp);l.next=tmpnode;l=l.next;}while(l1!=null){ListNode p=l1;l1=l1.next;int tmp=(p.val+carry)%10;carry=(p.val+carry)/10;ListNode tmpnode=new ListNode(tmp);l.next=tmpnode;l=l.next;}while(l2!=null){ListNode q=l2;l2=l2.next;int tmp=(q.val+carry)%10;carry=(q.val+carry)/10;ListNode tmpnode=new ListNode(tmp);l.next=tmpnode;l=l.next;}if(carry>0){ListNode tmpnode=new ListNode(carry);l.next=tmpnode;l=l.next;}return L.next;}
}
尾插法:
1.首先要保证便利l1,l2时,保存了第一个节点的信息之后要和后面的节点断开,不然会形成连锁反应
2.用l遍历新建立的链表,l,每次指向链表的末尾,L永远指向头节点

19.删除链表的倒数第n个节点

删除链表的节点的时候,第一个节点的删除和其他节点不一样,为了保证大家都一样,需要添加一个虚拟头节点,这样操作起来就一样了。
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode l=head;int count=0;//总的元素的个数while(l!=null){count++;l=l.next;}ListNode dummy=new ListNode(0);dummy.next=head;count++;//加上虚拟头节点,链表中节点的个数是count个。//原链表中倒数第n个节点,在原链表中排序是count+1-n;新链表中的排序是count-n;//原链表中倒数第n个节点的前一个节点,在新链表中是count-n-1l=dummy;int number=0;while(number<count-n-1){l=l.next;number++;}l.next=l.next.next;return dummy.next;}
}

七、

24.两两交换链表中的节点

1.每次需要将新链表末尾元素.next指向l2的第一个元素,这样才能把链表串起来.
2.还是得画图来做,用手画图一下子就清晰了
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode swapPairs(ListNode head) {if(head==null||head.next==null)return head;ListNode dummy=new ListNode(0);ListNode d=dummy;ListNode p=head;//用p来遍历链表ListNode q=head.next;while(p!=null&&p.next!=null ){q=p.next;d.next=q;p.next=q.next;q.next=p;d=p;p=p.next;}return dummy.next;}
}

25.K个一组翻转链表(坑点很多,必须多做几遍)

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode reverseKGroup(ListNode head, int k) {// 边界情况处理if (head == null || head.next == null) return head;// 哑节点用于简化操作ListNode dummy = new ListNode(0);ListNode pre=dummy;dummy.next = head;while(head!=null){ListNode first_end=findEnd(head,k);if(first_end==null)break;ListNode seconde_head=first_end.next;ListNode first_rev_head=reverseNode(head,first_end);//与前面连接pre.next= first_rev_head;//!!!!与后面连接,不然没办法遍历了head.next=seconde_head;//更新pre 和head进入下一个区间pre=head;//head是当前节点的尾巴head=seconde_head;}return dummy.next;}// 找到 k 组的结尾节点(第 k 个节点),如果不足 k 个返回 nullpublic ListNode findEnd(ListNode head, int k) {ListNode dummy=new ListNode(0);dummy.next=head;ListNode p = dummy;int count=0;while(p!=null&&count<k){p=p.next;count++;}return p; // 返回第 k 个节点}// 反转从 head 到 end 之间的链表,并返回新的头部public ListNode reverseNode(ListNode head, ListNode end) {ListNode dummy=new ListNode(0);dummy.next=head;ListNode p=head;ListNode nextHead=end.next;//必须用nextHead来标记,end在移动的过程中会变的while(p!=nextHead){ListNode p_next=p.next;p.next=dummy.next;dummy.next=p;p= p_next;}return dummy.next;}}

138.随机链表的复制

/*
// Definition for a Node.
class Node {int val;Node next;Node random;public Node(int val) {this.val = val;this.next = null;this.random = null;}
}
*/class Solution {public Node copyRandomList(Node head) {Node p=head;//使用p来遍历原来链表的head;while(p!=null){Node q=new Node(p.val);Node p_next=p.next;p.next=q;q.next= p_next;p=p_next;}//每个节点复制了一个,插入了原结点的后面//复制randomwhile (p != null) {if (p.random != null) {p.next.random = p.random.next;}p = p.next.next;}// 第三步:拆分链表,恢复原链表并构造复制链表p = head;Node newHead = head.next;Node q = newHead;while (p != null) {p.next = p.next.next;if (q.next != null) {q.next = q.next.next;q = q.next;}p = p.next;}return newHead;}
}

148.排序链表

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode sortList(ListNode head) {if (head == null || head.next == null) return head;// 找到链表的结尾ListNode tail = head;while (tail.next != null) {tail = tail.next;}// 归并排序return Mergesort(head, tail);}// 找链表的中间前驱节点(返回 slow 前一个节点)public ListNode findMiddlePre(ListNode head) {if (head == null || head.next == null) return null;ListNode slow = head, fast = head, prev = null;while (fast != null && fast.next != null) {prev = slow;slow = slow.next;fast = fast.next.next;}return prev; // 返回 slow 之前的节点}public ListNode Mergesort(ListNode head, ListNode tail) {if (head == tail) {return head;}ListNode middlePre = findMiddlePre(head);ListNode middle = middlePre.next;middlePre.next = null; // 断开链表// 递归排序ListNode left = Mergesort(head, middlePre);ListNode right = Mergesort(middle, tail);// 归并return merge(left, right);}// 归并两个有序链表public ListNode merge(ListNode left, ListNode right) {ListNode dummy = new ListNode(0);ListNode p = dummy;while (left != null && right != null) {if (left.val < right.val) {p.next = left;left = left.next;} else {p.next = right;right = right.next;}p = p.next;}// 连接剩余部分if (left != null) p.next = left;if (right != null) p.next = right;return dummy.next;}
}
1.易错点:在合并的时候才创建虚拟头节点进行合并,不能在递归传入,因为会改变值ListNode left=Mergesort(head,middle_pre,p);
2.链表合并的时候需要连接剩余部分,这点一定不能忘记

New

23.合并k个升序链表(看懂未做)

146.LRU缓存(未做)

二叉树的中序遍历

1.递归方法最好写成void类型,不容易出错
2.首先拿一个点的树判断逻辑,再拿三个节点的树来判断逻辑
class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res =new ArrayList<>();inorder(root,res);return res;}public void inorder(TreeNode root,List<Integer> res){if(root==null)return ;inorder(root.left,res);res.add(root.val);inorder(root.right,res);}
}

104.二叉树的最大深度

按照上面的思路来的,1.空节点2.一个节点2.三个节点

class Solution {public int maxDepth(TreeNode root) {if(root==null)return 0;int left =maxDepth(root.left)+1;int right =maxDepth(root.right)+1;return Math.max(left,right);}}

226.翻转二叉树

关于树的题越做越有感觉了,竟然又一次过了,哈哈哈哈哈
1.先考虑空节点的情况,空则怎么办
2.如果是一个节点呢,三个节点呢,处理完简单三个节点呢
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode invertTree(TreeNode root) {invertT(root);return root;}public void invertT(TreeNode root) {if(root==null) return ;TreeNode temp=root.left;root.left=root.right;root.right=temp;invertTree(root.left);invertTree(root.right);}
}

101.对称二叉树

1.先找到最小的子问题 也就是树只有两个节点
2.找到所有能直接返回的条件,否则才会递归
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public boolean isSymmetric(TreeNode root) {if(root==null)return false;return isTwoSymmetric(root.left,root.right);}public boolean isTwoSymmetric(TreeNode One,TreeNode Two) {if(One==null&&Two==null)return true;if(One==null||Two==null)return false;//One和Two均非空if(One.val!=Two.val)return false;return (isTwoSymmetric(One.left,Two.right)&&isTwoSymmetric(One.right,Two.left));}}   

543. 二叉树的直径

易错点:
1.直径是左节点高度+右节点高度
2.高度是Math.max(left,right)+1;
3.height(TreeNode root,int max)
这样的max是局部变量,不是全局变量!!!!!
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {private int max;public int diameterOfBinaryTree(TreeNode root) {height(root);return max;}public int height(TreeNode root){if(root==null)return 0;int left =height(root.left);int right =height(root.right);int len=Math.max(left,right)+1;max=Math.max(max,left+right);return len;    }
}

102.二叉树的层序遍历(看懂未做)

108.将有序数组转换为二叉搜索树(看懂未做)

98.验证二叉搜索树(看懂未做)

230.二叉搜索树中第k小的元素(有思路未做)

二叉搜索树中序遍历会得到有序数组,这是一个很重要的特性

199.二叉树的右视图(看懂未做)

114.二叉树展开为链表(看懂未做)

105.从前序与中序遍历序列构造二叉树(看懂未做)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不在同一个局域网的远程桌面连接怎么设置?本地内网计算机让其他网络远程访问6种常用方法

远程桌面是一种重要的技术&#xff0c;它允许用户通过网络远程访问和控制另一台计算机的桌面界面。但是&#xff0c;当被控制端和控制端不在同一个局域网内时&#xff0c;就需要进行一些额外的配置。本文将详细介绍在不同局域网下设置远程桌面的步骤&#xff0c;以帮助读者顺利…

天机学堂day10作业,完善兑换优惠券功能

UserCouponServiceImpl /*** 兑换码兑换优惠券* param code*/TransactionalOverridepublic void exchangeCoupon(String code) {//1、校验code是否为空if (StringUtils.isBlank(code)) {throw new BadRequestException("非法参数&#xff01;");}//2、解析兑换码&…

JAVA工程师面试题(七)

1、递归实现1,1,2,3,5,8,….第30个数是多少&#xff1f; public static int Foo(int i) { if (i < 0) return 0; else if(i > 0 && i < 2) return 1; else return Foo(i -1) Foo(i - 2); }…

Qt基础009(HTTP编程和QJSON)

文章目录 软件开发网络架构BS架构/CS架构 HTTP基本概念QT的HTTP编程JSON数据概述QT生成JSON数据QT解析JSON数据 软件开发网络架构 BS架构/CS架构 ​ 在计算机网络和软件开发中&#xff0c;CS架构&#xff08;Client-Server Architecture&#xff0c;客户端-服务器架构&#x…

高精度电流检测革命:同轴分流器的创新应用与技术演进

一、精密测量原理与结构创新 基于电磁场分布重构技术的新型同轴分流器&#xff0c;突破了传统电流测量的物理限制。该器件采用三维环形电阻矩阵结构&#xff0c;通过多层级导电环的精密排列&#xff0c;实现了电流路径的涡流自补偿。区别于常规分流器的平板式设计&#xff0c;其…

【使用层次序列构建二叉树(数据结构C)】

使用层次序列构建二叉树&#xff08;C语言实现&#xff09; 在数据结构学习过程中&#xff0c;二叉树的构建方式通常有递归建树&#xff08;前序/中序&#xff09;和层次建树&#xff08;广度优先&#xff09;两种。本文将介绍一种基于辅助队列实现的层次建树方法&#xff0c;并…

设置Rocky Linux盒盖不休眠的3个简单步骤

在 Rocky linux&#xff08;和其他基于 RHEL 的发行版&#xff09;中&#xff0c;当你关闭笔记本电脑的盖子时&#xff0c;默认行为通常是使系统休眠。如果你想更改这一行为&#xff0c;例如&#xff0c;使系统在关闭盖子时只是锁定&#xff0c;你可以按照以下步骤操作&#xf…

WPF的发展历程

文章目录 WPF的发展历程引言起源与背景&#xff08;2001-2006&#xff09;从Avalon到WPF设计目标与创新理念 WPF核心技术特点与架构基础架构与渲染模型关键技术特点MVVM架构模式 WPF在现代Windows开发中的地位与前景当前市场定位与其他微软UI技术的关系未来发展前景 社区贡献与…

【器件专题1——IGBT第1讲】IGBT:电力电子领域的 “万能开关”,如何撑起新能源时代?

一、IGBT 是什么&#xff1f;重新认识这个 “低调的电力心脏” 你可能没听过 IGBT&#xff0c;但一定用过它驱动的设备&#xff1a;家里的变频空调、路上的电动汽车、屋顶的光伏逆变器&#xff0c;甚至高铁和电网的核心部件里&#xff0c;都藏着这个 “电力电子开关的瑞士军刀”…

新闻速递丨Altair 与 Databricks 达成合作,加速数据驱动型创新

NEWS Altair 近日宣布与数据和人工智能公司 Databricks 达成战略合作&#xff0c;通过新一代数据统一化、图谱驱动智能和企业级人工智能&#xff08;AI&#xff09;技术赋能双方客户。 此次合作整合了两大平台的核心优势&#xff0c;将 Altair RapidMiner 平台的强大功能&…

c++11 :智能指针

目录 一 为什么需要智能指针&#xff1f; 二 智能指针的使用及原理 1. RAII 2. auto_ptr 3. unique_ptr 4. shared_ptr 5. weak_ptr 三 内存泄漏 1.什么是内存泄漏&#xff0c;内存泄漏的危害 2. 如何避免内存泄漏&#xff1f; 一 为什么需要智能指针&#xff1f; …

大模型在直肠癌预测及治疗方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 研究方法与创新点 二、大模型技术概述 2.1 大模型的基本原理 2.2 常见大模型类型及特点 2.3 在医疗领域的应用进展 三、直肠癌预测相关数据收集与处理 3.1 数据来源 3.2 数据清洗与预处理 3.3 特征工程 四、大…

VRRP与防火墙双机热备实验

目录 实验一&#xff1a;VRRP负载均衡与故障切换 实验拓扑​编辑一、实验配置步骤 1. 基础网络配置 2. VRRP双组配置 二、关键验证命令 1. 查看VRRP状态 2. 路由表验证 三、流量分析 正常负载均衡场景&#xff1a; 故障切换验证&#xff1a; 实验二&#xff1a;防火…

OpenCV中的SIFT特征提取

文章目录 引言一、SIFT算法概述二、OpenCV中的SIFT实现2.1 基本使用2.1.1 导入库2.1.2 图片预处理2.1.3 创建SIFT检测器2.1.4 检测关键点并计算描述符2.1.5 检测关键点并计算描述符并对关键点可视化2.1.6 印关键点和描述符的形状信息 2.2 参数调优 三、SIFT的优缺点分析3.1 优点…

【信息系统项目管理师】高分论文:论成本管理与采购管理(信用管理系统)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划成本管理2、成本估算3、成本预算4、成本控制论文 2019年1月,我作为项目经理参与了 XX基金管理有限公司信用管理系统项目。该项目成 本1000万,建设期为1年。通过该项目,XX基金管理有限公司在信用…

从边缘到云端,如何通过时序数据库 TDengine 实现数据的全局洞

在当今数字化转型加速的背景下&#xff0c;海量的数据生成和实时处理需求已成为企业面临的关键挑战。无论是物联网设备、工业自动化系统&#xff0c;还是智能城市的各类传感器&#xff0c;数据的采集、传输与分析效率&#xff0c;直接影响企业的决策与运营。为此&#xff0c;TD…

Axure全局变量的含义与基础应用

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:全局变量 主要内容:全局变量含义、基础应用 应用场景:元件赋值 案例展示: 案例视频:

题目 3320: 蓝桥杯2025年第十六届省赛真题-产值调整

题目 3320: 蓝桥杯2025年第十六届省赛真题-产值调整 时间限制: 2s 内存限制: 192MB 提交: 549 解决: 122 题目描述 偏远的小镇上&#xff0c;三兄弟共同经营着一家小型矿业公司 “兄弟矿业”。公司旗下有三座矿山&#xff1a;金矿、银矿和铜矿&#xff0c;它们的初始产值分别用…

常见缓存淘汰算法(LRU、LFU、FIFO)的区别与实现

一、前言 缓存淘汰算法主要用于在内存资源有限的情况下&#xff0c;优化缓存空间的使用效率。以确保缓存系统在容量不足时能够智能地选择需要移除的数据。 二、LRU&#xff08;Least Recently Used&#xff09; 核心思想&#xff1a;淘汰最久未被访问的数据。实现方式&#x…

linux ptrace 图文详解(七) gdb、strace跟踪系统调用

目录 一、gdb/strace 跟踪程序系统调用 二、实现原理 三、代码实现 四、总结 &#xff08;代码&#xff1a;linux 6.3.1&#xff0c;架构&#xff1a;arm64&#xff09; One look is worth a thousand words. —— Tess Flanders 相关链接&#xff1a; linux ptrace 图…