当前位置: 首页 > news >正文

【LeetCodehHot100_0x01】

LeetCodeHot100_0x01

1. 两数之和

解题思路: 暴力枚举法、哈希法
【暴力枚举】

class Solution {public int[] twoSum(int[] nums, int target) {int n = nums.length;for(int i=0;i<n;i++) {for(int j=i+1;j<n;j++) {if(nums[i] + nums[j] == target) {return new int[] {i,j};}}}return new int[0];}
}

【哈希法】要找 x + y = targer,则对于每一个x,只需要用哈希判断存不存在 y = targer - x;

class Solution {public int[] twoSum(int[] nums, int target) {// 存储值(键) + 下标Map<Integer,Integer> hs = new HashMap<>();for(int i=0;i<nums.length;i++) {// containsKey 方法用于寻找键是否存在if(hs.containsKey(target-nums[i])) {return new int[]{i,hs.get(target-nums[i])};}// 将当前映射哈希表hs.put(nums[i],i);}return new int[0];}
}

复习: HashMap数据结构、常用方法、使用场景

一、底层数据结构

  • HashMap 的底层由 数组 + 链表 + 红黑树 组成,核心设计目标是解决哈希冲突并保证高效操作。
  • 数组:默认长度16,长度始终是2的幂次方,每个元素都是一个桶,上面连接着链表或红黑树
  • 链表:解决哈希冲突,使用链地址法(尾插法避免并发场景死循环)
  • 红黑树:链表长度大于8转换,小于6退化。用于优化查询效率:O(n) —> O(logn)

二、常用方法

Map<R,V> hs = new HashMap<R,V>(); // 声明
put(K key, V value)     // 添加键值对
get(K key)                   // 获取值
containsKey(K key)      // 判断键是否存在
keySet()                // 获取所有键的集合
values()                // 获取所有值的集合
entrySet()              // 获取所有键值对
getOrDefault(K key, V defaultValue) // 安全获取值

三、使用场景: 快速插入/查询、统计频率


2. 字母异位词分词

解题思路: 将字符串排序后作为哈希的键,值则为已经符合的字符串列表
【哈希法】关键在于如何对字符串进行排序、如何更新已有的字符串列表

class Solution {public List<List<String>> groupAnagrams(String[] strs) {// 排序后作为哈希的键,值为存储相同的字符串列表Map<String,List<String>> hs = new HashMap<>();for(String str : strs) {// 取出字符串进行排序char[] str_ = str.toCharArray();Arrays.sort(str_);String key = new String(str_);// 取出该键中已有的字符串列表// 这里犯了一个错,这个列表可能是空的,后面会报错,需要用getOrDefault方法安全取值// List<String> str_list = hs.get(key);List<String> str_list = hs.getOrDefault(key,new ArrayList<>());str_list.add(str);hs.put(key,str_list);}List<List<String>> resList = new ArrayList<>(hs.values());return resList;}
}

复习: 对字符串进行排序思路

对字符串内的字符排序(例如将 “cab” 排序为 “abc”)
方法 1:字符数组排序(最常用)

String str = "cab";
char[] chars = str.toCharArray();
Arrays.sort(chars); // 默认升序排序
String sortedStr = new String(chars); // "abc"

方法 2:使用 Java 8 Stream API

String str = "cab";
String sortedStr = str.chars() // 转为 IntStream.sorted() // 对字符的 Unicode 值排序.collect(StringBuilder::new,StringBuilder::appendCodePoint,StringBuilder::append
).toString(); // "abc"

方法 3:转换为列表排序

String str = "cab";
List<Character> charList = new ArrayList<>();
for (char c : str.toCharArray()) {charList.add(c);
}
Collections.sort(charList); // 升序排序
StringBuilder sb = new StringBuilder();
for (Character c : charList) {sb.append(c);
}
String sortedStr = sb.toString(); // "abc"

3. 最长连续序列

解题思路: 用哈希存下来,然后遍历哈希列表,找到最长连续的序列,其长度就是答案
【哈希法】

class Solution {public int longestConsecutive(int[] nums) {// 哈希 ---> Set版去重Set<Integer> hs = new HashSet<>();for(int num : nums) {// 加入哈希hs.add(num);}int res = 0;    // 记录答案for(int num : hs) {// 查看hs中有多少个连续的值if(!hs.contains(num-1)) { // 重新规划起点int currN = num;int currC = 1;// 开始匹配while(hs.contains(currN + 1)) {currN ++;currC ++;}res = Math.max(res,currC);} }return res;}
}

【动态规划法】定义动规:fn[i] : 以第i个元素结尾的最大值,转移存在以下关系:

  • ==1 : fn[i] = fn[i-1] + 1;
  • ==0 : fn[i] = fn[i-1];
  • order : fn[i] = 1;
class Solution {public int longestConsecutive(int[] nums) {// 排序 + 动态规划//1. 排除边界值if(nums.length == 1) return 1;if(nums.length == 0) return 0;//2. 排序Arrays.sort(nums);//3. 定义动规方程意义(fn[i] 以第i个元素结尾中最大的连续值长度)int []fn = new int[nums.length];//4. 初始化值fn[0] = 1;int res = fn[0];//5. 遍历更新方程for(int i=1;i<nums.length;i++) {if(nums[i] - nums[i-1] == 1) {fn[i] = fn[i-1] + 1; }else if(nums[i] == nums[i-1]) {fn[i] = fn[i-1];}else {fn[i] = 1;}res = Math.max(res,fn[i]);}return res;} 
}

复习: HashSet常用方法

HashSet(基于 HashMap)
特点:无序,插入/查询 O(1)
常用方法

add(E e)                // 添加元素
remove(Object o)        // 删除元素
contains(Object o)      // 是否包含元素

  1. TreeSet(基于 TreeMap)
    特点:元素有序(自然排序或自定义 Comparator),插入/查询 O(log n)
    特有方法
first(), last()         // 最小/最大元素
ceiling(E e), floor(E e) // 类似 TreeMap

4. 移动零

解题思路: 整体向前偏移,在最后补若干零

class Solution {public void moveZeroes(int[] nums) {// 整体偏移int i = 0;  // 记录非零值指针// 将前面变成非零,后面变成0for(int j=0;j<nums.length;j++) {if(nums[j] != 0) nums[i++] = nums[j];}for(int k = i;k<nums.length;k++) {nums[k] = 0;}}
}

5、盛最多水的容器

解题思路: 双指针,不断缩小容器宽度,记录过程中的最优解
【双指针法】:关键:移动策略:哪边短移动哪边。

class Solution {public int maxArea(int[] height) {// 认识:(长 * 宽)Max、木桶效应// 双端指针,靠近过程必然宽会变小,长要扩大才有最优// 移动那边?肯定是短板的一端移动更优int len = height.length;int res = (len-1) * Math.min(height[0] ,height[len-1]);int i=0,j=len-1;while(i<j) {if(height[i] >= height[j]) j--;else i++;int temp = (j-i)*Math.min(height[i],height[j]);res = Math.max(res,temp);}return res;}
}

6、三数之和(不熟)

解题思路: 使用暴力法无法通过,遇到了时间复杂度问题过高。正确的做法因该是用双指针
【暴力法】超出时间限制 308 / 313 个通过的测试用例

  • 首先通过排序将重复项聚集,便于后续去重;接着通过三重循环枚举所有不重复的三元组。
class Solution {public List<List<Integer>> threeSum(int[] nums) {// 排序 + 暴力枚举所有可能List<List<Integer>> reslist = new ArrayList<>();Arrays.sort(nums);for(int i=0;i<nums.length-2;i++) {// 去重1:if(i>0 && nums[i] == nums[i-1])continue;for(int j=i+1;j<nums.length-1;j++) {// 去重2:if(j>i+1 && nums[j] == nums[j-1]) continue;for(int k=j+1;k<nums.length;k++) {// 去重3:if(k >j+1 && nums[k] == nums[k-1]) continue;if(nums[i] + nums[j] + nums[k] == 0) {reslist.add(Arrays.asList(nums[i],nums[j],nums[k]));} }}}return reslist;}
}

【双指针法】

  • 三重循环枚举a+b+c==0,在确定a、b后,c只有唯一的一个值
  • 在确定a后,那么 b + c = -a,也就是说b越大,c越小,两者存在一个关系
  • 于是对于第二重循环和第三重循环,我们可以利用双端指针来寻找在a固定下符合的所有b、c集合
class Solution {public List<List<Integer>> threeSum(int[] nums) {// 排序+ 双指针枚举List<List<Integer>> reslist = new ArrayList<>();Arrays.sort(nums);int n = nums.length;for(int a=0;a<n;a++) {// 去重if(a>0 && nums[a] == nums[a-1]) continue;for(int b=a+1,c=n-1;b<n-1;b++){// 去重if(b > a+1 && nums[b] == nums[b-1])continue;// 枚举符合条件的c(c是从大到小枚举的,界限是直到小于就不符合了)while(c>b && nums[b] + nums[c] > -nums[a])c--;if(c==b)break;  // 找不到if(nums[a] + nums[b] + nums[c] ==0)reslist.add(Arrays.asList(nums[a],nums[b],nums[c]));}}return reslist;}
}

7、接雨水(不会)

求解思路: 提前预处理出当前位置的左边最高高度、右边最高高度,然后与当前位置高度差就是当前位置能够储存水的量。再求和。

class Solution {public int trap(int[] height) {// 这道题目理解完其实不难了,关键你要明白一个问题:i位置的雨水量怎么算?// 取决于(i左边最高 ,i右边最高)min【木桶效应】,记为H// i位置的高度h// i位置能储水 H-h// 所以关键在于如何快速的找到i左边、右边的最高高度---提前预处理出来int n = height.length;if(n==0) return 0;int[] leftMax = new int[n];int[] rightMax = new int[n];leftMax[0] = height[0];rightMax[n-1]=height[n-1];for(int i=1;i<n;i++) {leftMax[i] = Math.max(leftMax[i-1],height[i]);}for(int i=n-2;i>=0;i--){rightMax[i] = Math.max(rightMax[i+1],height[i]);}// 计算每一格可以存水量int res = 0;for(int i=0;i<n;i++) {res += Math.min(leftMax[i],rightMax[i]) - height[i];}return res;}
}

8、无重复字符的最长子串

解题思路: 遍历枚举开头,用哈希表判断过程中符合的最长子串
【哈希法】O(N^2)复杂度,还是不太优美

class Solution {public int lengthOfLongestSubstring(String s) {// 用哈希来判断字符串有没有重复if(s.length() < 2) return s.length();int res = 1;for(int i=0;i<s.length();i++) {//	每次循环都定义一个哈希表,用来判断什么时候出现重复的字符,则该长度终止Map<Character,Boolean> hm = new HashMap<>();hm.put(s.charAt(i),true);int temp = 1;for(int j=i+1;j<s.length();j++) {// 判断是否存在当前键if(hm.containsKey(s.charAt(j))) {break;}else {temp++;hm.put(s.charAt(j),true);}}res = Math.max(res,temp);}return res;}
}

【滑动窗口法】优化思路:假设从k到第rk个元素才发生重复冲突,那么k+1到第rk元素定然没有冲突,我们就可以继续向右扩展,直到出现冲突。重复以往。这个思路的好处是利用公共并不冲突的位置减少了很多判断过程,类似一个滑动的窗口一样。只需要一次遍历就可以得到答案。

class Solution {public int lengthOfLongestSubstring(String s) {int n = s.length();if(n<2)return n;// 滑动窗口Set<Character> hs = new HashSet<>();int j = 0, res = 1; // 定义右指针,初始值为-1for(int i=0;i<n;i++) {// 左边指针右移,跳一个 if(i != 0) {hs.remove(s.charAt(i-1));}// 右移指针直到出现冲突while(j<n && !hs.contains(s.charAt(j))) {hs.add(s.charAt(j));j++;}// 更新答案res = Math.max(res,j-i);}return res;}
}

9、找到字符串中所有字母异位词 (不熟)

解题思路: 这题的解题思路几乎和我想的一样,滑动窗口 + 哈希表维护。需要学习的是它的代码思路,通过Arrays工具类中的equals方法可以快速判断两个数列是否完全相同,真是让我学了一招,这样的话,我们利用数组将字符串p中的字符组成拷贝下来,在维护窗口的过程中,判断更新的s的子串是否也是与p相同的字符组成,是则代表该字符串的开头就是一个答案。

class Solution {public List<Integer> findAnagrams(String s, String p) {// 滑动窗口 + 数组哈希int[] Scnt = new int[26];int[] Pcnt = new int[26];int size = p.length();int n = s.length();if(n < size) return new ArrayList<Integer>();List<Integer> res = new ArrayList<>();for(int i=0;i<size;i++) {Scnt[s.charAt(i)-'a']++;Pcnt[p.charAt(i)-'a']++;}// (不要漏了!!)判断开头是不是原本就符合要求的if(Arrays.equals(Scnt,Pcnt)) {res.add(0);}for(int i=0;i<n-size;i++) { // 枚举当前需要删除的窗口左值Scnt[s.charAt(i)-'a']--;    // 滑动窗口维护左边的字符对应的数量减少Scnt[s.charAt(i+size)-'a']++; // 窗口右侧对应的字符数量增加// 判断字符组成是否完全相同if(Arrays.equals(Scnt,Pcnt)) {res.add(i+1);}}return res;}
}

10、和为K的子数组

求解思路: 暴力两层循环直接过了,不懂
【暴力法】

class Solution {public int subarraySum(int[] nums, int k) {int res = 0;int n = nums.length;// 左边界for(int i=0;i<n;i++) { int sum = nums[i];// 不要漏if(sum == k) {res += 1;// continue;    这个是错误的,虽然已经相等了,但是不能忘记后面可能会有+0的情况}// 右边界for(int j=i+1;j<n;j++) {sum += nums[j];if(sum == k) {res += 1;// break; 这个是错误的,虽然已经相等了,但是后面可能还有 +0 或 正负和为0}}}return res;}
}

11、总结

今天的题目对于我这个小菜鸡来说还是有点难度的。不过每一题都给我学到了一些东西。总体上涉及到哈希表的常用方法和场景、Arrays工具类、动态规划、双指针、滑动窗口等知识点。过两天需要复习巩固!

相关文章:

【LeetCodehHot100_0x01】

LeetCodeHot100_0x01 1. 两数之和 解题思路&#xff1a; 暴力枚举法、哈希法 【暴力枚举】 class Solution {public int[] twoSum(int[] nums, int target) {int n nums.length;for(int i0;i<n;i) {for(int ji1;j<n;j) {if(nums[i] nums[j] target) {return new in…...

Qt::MouseButtons解析

一 问题 今天想自定定义一个QMouseEvent变量,变量的的初始化参数有Qt::MouseButtons,这是个啥?查看类型为QFlags<Qt::MouseButton>。 二 Qt::MouseButton Qt::MouseButton 是 Qt 框架中定义的一个枚举类型(enum),用于表示鼠标事件中的物理按钮。它是 Qt 事件处理…...

跨域问题解释及前后端解决方案(SpringBoot)

一、问题引出 有时,控制台出现如下问题。 二、为什么会有跨域 2.1浏览器同源策略 浏览器的同源策略 &#xff08; Same-origin policy &#xff09;是一种重要的安全机制&#xff0c;用于限制一个源&#xff08; origin &#xff09;的文档或 脚本如何与另一个源的资源进行…...

4-知识图谱的抽取与构建-4_2实体识别与分类

&#x1f31f; 知识图谱的实体识别与分类&#x1f525; &#x1f50d; 什么是实体识别与分类&#xff1f; 实体识别&#xff08;Entity Recognition&#xff09;是从文本中提取出具体的事物&#xff0c;如人名、地名、组织名等。分类&#xff08;Entity Classification&#x…...

腾讯云大模型知识引擎×DeepSeek赋能文旅

腾讯云大模型知识引擎DeepSeek赋能文旅 ——以合肥文旅为例的技术革新与实践路径 一、技术底座&#xff1a;知识引擎与DeepSeek的融合逻辑 腾讯云大模型知识引擎与DeepSeek模型的结合&#xff0c;本质上是**“知识库检索增强生成&#xff08;RAG&#xff09;实时联网能力”**…...

TMDS视频编解码算法

因为使用的是DDR进行传输&#xff0c;即双倍频率采样&#xff0c;故时钟只用是并行数据数据的5倍&#xff0c;而不是10倍。 TMDS算法流程&#xff1a; 视频编码TMDS算法流程实现&#xff1a; timescale 1 ps / 1ps //DVI编码通常用于视频传输&#xff0c;将并行数据转换为适合…...

C++程序员内功修炼——Linux C/C++编程技术汇总

在软件开发的宏大版图中&#xff0c;C 语言宛如一座巍峨的高山&#xff0c;吸引着无数开发者攀登探索。而 Linux 操作系统&#xff0c;以其开源、稳定、高效的特性&#xff0c;成为了众多开发者钟爱的开发平台。将 C 与 Linux 相结合&#xff0c;就如同为开发者配备了一把无坚不…...

【数据结构】链表中快指针和慢指针

目录 一、找出并返回链表的中间结点 二、输出链表中倒数第k个结点 三、判断链表中是否有环 四、两个单链表相交 一、找出并返回链表的中间结点 给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 要求&#xff1a;只遍历…...

6_zookeeper集群配置

配置 一、配置myid文件 # 进入解压好的文件夹下面 touch myid vim myid # master节点写0&#xff0c;slave1节点写1&#xff0c;slave2节点写2二、配置zoo.cfg文件 1.在master节点编辑zookeeper配置文件 # 进入解压好的文件夹下面 cd conf/ cp zoo_sample.cfg zoo.cfg vim …...

Docker核心概念

容器介绍 Docker 是世界领先的软件容器平台&#xff0c;所以想要搞懂 Docker 的概念我们必须先从容器开始说起。 什么是容器? 先来看看容器较为官方的解释 一句话概括容器&#xff1a;容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署。 容器镜像是轻量…...

LD_PRELOAD 绕过 disable_function 学习

借助这位师傅的文章来学习通过LD_PRELOAD来绕过disable_function的原理 【PHP绕过】LD_PRELOAD bypass disable_functions_phpid绕过-CSDN博客 感谢这位师傅的贡献 介绍 静态链接&#xff1a; &#xff08;1&#xff09;举个情景来帮助理解&#xff1a; 假设你要搬家&#x…...

如何用JAVA实现布隆过滤器?

目录 引言 布隆过滤器的原理 1. 核心思想 2. 优缺点 布隆过滤器的使用场景 Java 实现布隆过滤器 1. 实现步骤 2. 代码实现 3. 代码说明 4. 测试结果 布隆过滤器的优化 总结 引言 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种高效的概率数据结构&#xff0…...

游戏开发 游戏开始界面

目录 前言 一 游戏初始化界面的分析 二 游戏的大概框架 三 显示界面的开发 四 完整代码 总结 我们可以来看看游戏初始界面是什么样的 勇士游戏样例 前言 这里是开发游戏的初始界面 一 游戏初始化界面的分析 我们需要一个背景图&#xff0c;开始游戏图标&#xff0…...

Python解析 Flink Job 依赖的checkpoint 路径

引言 Apache Flink 是一个强大的分布式处理框架&#xff0c;广泛用于批处理和流处理任务。其 checkpoint 机制是确保容错的关键功能&#xff0c;允许在计算过程中保存状态&#xff0c;以便在故障时从最近的 checkpoint 恢复。本文详细探讨了一个 Python 脚本&#xff0c;该脚本…...

Javascript网页设计案例:通过PDFLib实现一款PDF分割工具,分割方式自定义-完整源代码,开箱即用

功能预览 一、工具简介 PDF 分割工具支持以下核心功能: 拖放或上传 PDF 文件:用户可以通过拖放或点击上传 PDF 文件。两种分割模式: 指定范围:用户可以指定起始页和结束页,提取特定范围的内容。固定间距:用户可以设置间隔页数(例如每 5 页分割一次),工具会自动完成分…...

计算机视觉算法实战——产品分拣(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ 1. 领域简介✨✨ 产品分拣是工业自动化和物流领域的核心技术&#xff0c;旨在通过机器视觉系统对传送带上的物品进行快速识别、定位和分类&a…...

汽车软件︱AUTO TECH China 2025 广州国际汽车软件与安全技术展览会:开启汽车科技新时代

在汽车产业智能化与网联化飞速发展的当下&#xff0c;汽车软件与安全技术已然成为行业变革的核心驱动力。2025年11月20 - 22日&#xff0c;AUTO TECH China 2025 广州国际汽车软件与安全技术展览会将在广州保利世贸博览馆盛大开幕&#xff0c;这场展会将汇聚行业前沿成果&#…...

Visual Studio打开文件后,中文变乱码的解决方案

文件加载 使用Unicode&#xff08;UTF-8&#xff09;编码加载文件 C:\WorkSpace\Assets\Scripts\UI\View\ExecuteComplateView.cs时&#xff0c;有些字节已用Unicode替换字符替换。保存该文件将不会保留原始文件内容。...

Python爬虫selenium验证-中文识别点选+图片验证码案例

1.获取图片 import re import time import ddddocr import requests from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.wait import WebDriverWait from …...

MySQL后端返回给前端的时间变了(时区问题)

问题&#xff1a;MySQL里的时间例如为2025-01-10 21:19:30&#xff0c;但是返回到前端就变成了2025-01-10 13:19:30&#xff0c;会出现小时不一样或日期变成隔日的问题 一般来说设计字段时会使用datetime字段类型&#xff0c;这是一种用于时间的字段类型&#xff0c;而这个类型…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...