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

滑动窗口思想 面试算法高频题

基本思想

滑动窗口思想其实就是快慢型的特例

计算机网络中滑动窗口协议(Sliding Window Protocol),该协议是TCP实现流量控制等的核心策略之一。事实上在与流量控制、熔断、限流、超时等场景下都会首先从滑动窗口的角度来思考问题,例如hystrix、sentinel等框架都使用了这种思想。

什么是窗口的滑动:

  • 窗口:窗口其实就是两个变量left和right之间的元素,也可以理解为一个区间。窗口大小可能固定,也可能变化,如果是固定大小的,那么自然要先确定窗口是否越界,再执行逻辑处理。如果不是固定的,就要先判断是否满足要求,再执行逻辑处理。

  • 滑动:说明这个窗口是移动的,事实上移动的仍然是left和right两个变量,而不是序列中的元素。当变量移动的时,其中间的元素必然会发生变化,因此就有了这种不断滑动的效果。

在实际问题中,窗口大小不一定是固定的,我们可以思考两种场景:

  • 固定窗口的滑动就是火车行驶这种大小不变的移动 。

  • 可变的窗口就像两个老师带着一队学生外出,一个负责开路,一个负责断后,中间则是小朋友。两位老师之间的距离可能有时大有时小,但是整体窗口是不断滑动的。

根据窗口大小是否固定,可以造出两种类型的题:

  • 如果是固定的,则一般会让你求哪个窗口的元素最大、最小、平均值、和最大、和最小等等类型的问题。

  • 如果窗口是变的,则一般会让你求一个序列里最大、最小窗口是什么等等。

滑动窗口题目本身没有太高的思维含量,但是实际在解题的时候仍然会感觉比较吃力,主要原因有以下几点:

  • 解题最终要落实到数组上,特别是边界处理上,这是容易晕的地方,稍有疏忽就难以得到准确的结果。

  • 有些元素的比较、判断等比较麻烦,不仅要借助集合等工具,而且处理过程中还有一些技巧,如果不熟悉会导致解题难度非常大。

  • 堆!我们在前面介绍过,堆结构非常适合在流数据中找固定区间内的最大、最小等问题。因此滑动窗口经常和堆一起使用可以完美解决很多复杂的问题。

那双指针和滑动窗口啥区别呢?根据性质我们可以看到,滑动窗口是双指针的一种类型,主要关注两个指针之间元素的情况,因此范围更小一些,而双指针的应用范围更大,题型也更多。

子数组最大平均数

给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。

其中 1<=k<=nums.length<=10^5。

  • 典型滑动窗口;先读取k个元素,再逐步让窗口向前走。

public static double findMaxAverage(int[] nums, int k) {int len = nums.length;int widowSum = 0;if (k > nums.length || nums.length < 1 || k < 1) {return 0;}//   第一步 先求第一个窗口的和for (int i = 0; i < k; i++) {widowSum += nums[i];}//  第二步 :遍历,每次右边增加一个,左边减去一个,重新计算窗口最大值int res = widowSum;for (int right = k; right < len; right++) {widowSum += nums[right] - nums[right - k];res = Math.max(res, widowSum);}return (double) res / k;
}

最长连续递增序列

给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该序列的长度。

输入:nums = [1,3,5,4,7]
输出:3
解释:最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。
  • 从第 2 个元素开始,先定义[left,right)的区间来表示当前的递增区间,执行如下操作:

    • 如果当前遍历到的元素比它左边的那一个元素要严格大,right就增加;

    • 否则就将left跳到right的起始位置,重新开始计算。

public static int findLengthOfLCIS(int[] nums) {int left = 0, right = 0;int res = 0;while (right < nums.length) {//右侧的新元素比左侧的小,则重新开始记录left位置//该问题本质就是快慢指针,left就是slow指针if (right > 0 && nums[right - 1] >= nums[right]) {left = right;}right++;res = Math.max(res, right - left);}return res;
}

  • 一边遍历,一边统计每个递增区间的长度,如果长度超过之前所有区间的长度

public static int findLengthOfLCIS(int[] nums) {int curLen = 1;//当前连续递增区间的长度int res = 1;for (int i = 1; i < nums.length; i++) {if (nums[i - 1] >= nums[i]) {//不满足要求,重新开始计数curLen = 1;} else {curLen++;}res = Math.max(curLen, res);}return res;
}

最长子串专题

无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。

输入: s = "abcabcbb"

输出: 3

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

  • 要找最长子串,必然要知道无重复字符串的首和尾,然后再从中确定最长的那个,因此至少两个指针才可以,这就想到了滑动窗口思想。

  • 即使使用滑动窗口,深入分析会发现具体处理起来有多种方式。这里介绍一种经典的使用Map的思路。

public  int lengthOfLongestSubstring(String s) {if (s.length() == 0) return 0;HashMap<Character, Integer> map = new HashMap<Character, Integer>();int max = 0;int left = 0;for (int right = 0; right < s.length(); right++) {if (map.containsKey(s.charAt(right))) {left = Math.max(left, map.get(s.charAt(right)) + 1);}map.put(s.charAt(right), right);max = Math.max(max, right - left + 1);}return max;
}

最多包含两个不同字符的最长子串

给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度

输入: "eceba"

输出: 3

解释: t 是 "ece",长度为3。

  • 怎么判断只有2个元素

  • 移除的时候怎么知道移除谁,以及移除之后left是什么。

    del_idx = Collections.min(hashmap.values());

    left = del_idx + 1;

    • 这个 hashmap 包括不超过 3 个元素。这里还要考虑到要移除谁,所以我们要设计一下Hash的Key-Value的含义。我们把字符串里的字符都当做键,在窗口中的最右边的字符位置作为值。

public  int lengthOfLongestSubstringTwoDistinct(String s) {if (s.length() < 3) {return s.length();}int left = 0, right = 0;HashMap<Character, Integer> hashmap = new HashMap<>();int maxLen = 2;while (right < s.length()) {if (hashmap.size() < 3)hashmap.put(s.charAt(right), right++);// 如果大小达到了3个if (hashmap.size() == 3) {// 最左侧要删除的位置int del_idx = Collections.min(hashmap.values());hashmap.remove(s.charAt(del_idx));// 窗口left的新位置left = del_idx + 1;}maxLen = Math.max(maxLen, right - left);}return maxLen;
}

至多包含k个不同字符的最长子串

给定一个字符串 s,找出 至多 包含 k 个不同字符的最长子串T。

输入: s = "eceba", k = 2

输出: 3

解释: 则 T 为 "ece",所以长度为 3。

  • 只要将判断hash大小为2改成k就可以

public  int lengthOfLongestSubstringKDistinct(String s, int k) {if (s.length() < k + 1) {return s.length();}int left = 0, right = 0;HashMap<Character, Integer> hashmap = new HashMap<>();int maxLen = k;while (right < s.length()) {if (hashmap.size() < k + 1)hashmap.put(s.charAt(right), right++);// 如果大小达到了k个if (hashmap.size() == k + 1) {int del_idx = Collections.min(hashmap.values());hashmap.remove(s.charAt(del_idx));// 窗口left的新位置left = del_idx + 1;}maxLen = Math.max(maxLen, right - left);}return maxLen;
}

长度最小的子数组

长度最小的子数组,给定一个含有 n 个正整数的数组和一个正整数 target

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

输入:target = 7, nums = [2,3,1,2,4,3]

输出:2

解释:子数组 [4,3] 是该条件下的长度最小的子数组。

  • 先让元素不断入队,当入队元素和等于target时就记录一下此时队列的容量,如果队列元素之和大于target则开始出队, 直到小于target则再入队。如果出现等于target的情况,则记录一下此时队列的大小,之后继续先入队再出队。每当出现元素之和等于target时我们就保留容量最小的那个。

public int minSubArrayLen(int target, int[] nums) {int left = 0, right = 0, sum = 0, min = Integer.MAX_VALUE;while (right < nums.length) {sum += nums[right++];while (sum >= target) {min = Math.min(min, right - left);sum -= nums[left++];}}return min == Integer.MAX_VALUE ? 0 : min;
}

盛水最多的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。

输入:[1,8,6,2,5,4,8,3,7]

输出:49

解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

设两指针 i , j ,指向的水槽板高度分别为 h[i] , h[j] ,此状态下水槽面积为S(i,j) 。由于可容纳水的高度由两板中的 短板 决定,因此可得如下面积公式 :

S(i,j)=min(h[i],h[j])×(j−i)

在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽底边宽度−1 变短:

  • 若向内移动短板 ,水槽的短板min(h[i],h[j]) 可能变大,因此下个水槽的面积可能增大 。

  • 若向内移动长板 ,水槽的短板min(h[i],h[j]) 不变或变小,因此下个水槽的面积一定变小 。

因此,只要初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两指针相遇时跳出;即可获得最大面积。

public int maxArea(int[] height) {int i = 0, j = height.length - 1, res = 0;while(i < j) {res = height[i] < height[j] ? Math.max(res, (j - i) * height[i++]): Math.max(res, (j - i) * height[j--]); }return res;
}

寻找子串异位词

如果两个字符串仅仅是字母出现的位置不一样,则称两者相互为对方的一个排列,也称为异位词。

字符串的排列

给你两个字符串s1和s2 ,写一个函数来判断 s2是否包含 s1的排列。如果是,返回 true ;否则,返回 false 。换句话说,s1 的排列之一是 s2 的子串 。其中s1和s2都只包含小写字母。

思路:

  • 因为字符串s1的异位词长度一定是和s2字符串的长度一样的,所以很自然的想到可以以s1.length()为大小截图一个固定窗口,然后窗口一边向右移动,一边比较就行了。字母类型一样,每个字母出现的个数也是一样的。题目说s1和s2都仅限小写字母,因此我们可以创建一个大小为26的数组,每个位置就存储从a到z的个数,为了方便操作,索引我们使用index=s1.charAt(i) - 'a'来表示,这是处理字符串的常用技巧。此时窗口的right向右移动就是执行:charArray2[s2.charAt(right) - 'a']++;而left向右移动就是执行:int left = right - sLen1; charArray2[s2.charAt(left) - 'a']--;

public boolean checkInclusion(String s1, String s2) {int sLen1 = s1.length(), sLen2 = s2.length();if (sLen1 > sLen2) {return false;}int[] charArray1 = new int[26];int[] charArray2 = new int[26];//先读最前面的一段来判断。for (int i = 0; i < sLen1; ++i) {++charArray1[s1.charAt(i) - 'a'];++charArray2[s2.charAt(i) - 'a'];}if (Arrays.equals(charArray1, charArray2)) {return true;}for (int right = sLen1; right < sLen2; ++right) {charArray2[s2.charAt(right) - 'a']++;int left = right - sLen1;charArray2[s2.charAt(left) - 'a']--;if (Arrays.equals(charArray1, charArray2)) {return true;}}return false;
}

寻找字符串中的所有字母异位

找到字符串中所有字母异位词,给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。注意s和p仅包含小写字母。

输入: s = "cbaebabacd", p = "abc"

输出: [0,6]

解释:

起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。

起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

  • 与上题 的唯一区别:需要用一个List,如果出现异位词,还要记录其开始位置,那直接将其add到list中就可以了

public List<Integer> findAnagrams(String s, String p) {int sLen = s.length(), pLen = p.length();if (sLen < pLen) {return new ArrayList<Integer>();}List<Integer> ans = new ArrayList<Integer>();int[] sCount = new int[26];int[] pCount = new int[26];//先分别初始化两个数组for (int i = 0; i < pLen; i++) {sCount[s.charAt(i) - 'a']++;pCount[p.charAt(i) - 'a']++;}if (Arrays.equals(sCount, pCount)) {ans.add(0);}for (int left = 0; left < sLen - pLen; left++) {sCount[s.charAt(left) - 'a']--;int right=left + pLen;sCount[s.charAt(right) - 'a']++;if (Arrays.equals(sCount, pCount)) {//上面left多减了一次,所以ans.add(left + 1);}}return ans;
}

堆&滑动窗口结合

堆的大小一般是有限的,而且能直接返回当前位置下的最大值或者最小值,该特征与滑动窗口结合解决特定场景问题。

Question:给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位,返回滑动窗口中的最大值。

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3

输出:[3,3,5,5,6,7]

解释:

滑动窗口的位置 最大值


[1 3 -1] -3 5 3 6 7 3

1 [3 -1 -3] 5 3 6 7 3

1 3 [-1 -3 5] 3 6 7 5

1 3 -1 [-3 5 3] 6 7 5

1 3 -1 -3 [5 3 6] 7 6

1 3 -1 -3 5 [3 6 7] 7

  • 对于最大值、K个最大这种场景,优先队列(堆)是首先应该考虑的思路。大根堆可以帮助我们实时维护一系列元素中的最大值。

  • 本题初始时,我们将数组 nums 的前 k个元素放入优先队列中。每当我们向右移动窗口时,我们就可以把一个新的元素放入优先队列中,此时堆顶的元素就是堆中所有元素的最大值。然而这个最大值可能并不在滑动窗口中,在这种情况下,这个值在数组 nums 中的位置出现在滑动窗口左边界的左侧。因此,当我们后续继续向右移动窗口时,这个值就永远不可能出现在滑动窗口中了,我们可以将其永久地从优先队列中移除。我们不断地移除堆顶的元素,直到其确实出现在滑动窗口中。此时,堆顶元素就是滑动窗口中的最大值。为了方便判断堆顶元素与滑动窗口的位置关系,我们可以在优先队列中存储二元组 (num,index),表示元素num 在数组中的下标为index。

public int[] maxSlidingWindow(int[] nums, int k) {int n = nums.length;PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>() {public int compare(int[] pair1, int[] pair2) {return pair1[0] != pair2[0] ? pair2[0] - pair1[0] : pair2[1] - pair1[1];}});for (int i = 0; i < k; ++i) {pq.offer(new int[]{nums[i], i});}int[] ans = new int[n - k + 1];ans[0] = pq.peek()[0];for (int i = k; i < n; ++i) {pq.offer(new int[]{nums[i], i});// 过期的最大值会被及时清理 保证最大值有效性while (pq.peek()[1] <= i - k) {pq.poll();}ans[i - k + 1] = pq.peek()[0];}return ans;}

相关文章:

滑动窗口思想 面试算法高频题

基本思想 滑动窗口思想其实就是快慢型的特例 计算机网络中滑动窗口协议&#xff08;Sliding Window Protocol&#xff09;&#xff0c;该协议是TCP实现流量控制等的核心策略之一。事实上在与流量控制、熔断、限流、超时等场景下都会首先从滑动窗口的角度来思考问题&#xff0…...

Linux中特殊的变量

1.$# 含义&#xff1a;表示传入脚本或函数的参数数量。 用法&#xff1a;用于检查用户是否提供了足够的参数。 示例&#xff1a; #!/bin/bash echo "参数数量: $#"2.$? 含义&#xff1a;表示上一条命令的退出状态。如果命令成功执行&#xff0c;值为 0&#xff1b;…...

Linux文件系统与日志分析

目录 一.日志 1.1日志的定义 1.2日志的功能 1.3日志的分类 1.4日志的文件格式 1.5用户日志 1.6一些常见的日志 1.7日志消息的级别 二.系统日志管理 rsyslog 2.1rsyslog的定义 2.2rsyslog 配置文件 2.3rsyslog的实际应用----单独显示某一服务的日志 1.编辑rsyslog配…...

从传统物流到智能调度的全链路升级

一、TMS系统升级的核心目标与整体框架 &#xff08;一&#xff09;为什么要升级&#xff1f;传统物流管理的三大痛点 调度效率低下&#xff1a;过去依赖人工分单、手动匹配承运商&#xff0c;订单量大时容易出错&#xff0c;比如不同区域的订单混排导致运输路线绕路&#xff…...

UE5中如何修复后处理动画蓝图带来的自然状态下的metablriger身体绑定形变(如耸肩)问题

【[metablriger] UE5中如何修复后处理动画蓝图带来的自然状态下的metablriger身体绑定形变(如耸肩)问题】 UE5中如何修复后处理动画蓝图带来的自然状态下的metablriger身体绑定形变(如耸肩)问题...

STL_vector_01_基本用法

&#x1f44b; Hi, I’m liubo&#x1f440; I’m interested in harmony&#x1f331; I’m currently learning harmony&#x1f49e;️ I’m looking to collaborate on …&#x1f4eb; How to reach me …&#x1f4c7; sssssdsdsdsdsdsdasd&#x1f383; dsdsdsdsdsddfsg…...

css2学习总结之尚品汇静态页面

css2总结之尚品汇 一、布局 在 PC 端网页中&#xff0c;一般都会有一个固定宽度且水平居中的盒子&#xff0c;来显示网页的主要内容&#xff0c;这是网页 的版心。 版心的宽度一般是 960 ~ 1200 像素之间。 版心可以是一个&#xff0c;也可以是多个。 二、布局相关名词 我…...

Lua 第5部分 表

表&#xff08; Table &#xff09;是 Lua 语言中最主要&#xff08;事实上也是唯一的&#xff09;和强大的数据结构。 使用表&#xff0c;Lua语言可以以一种简单、统一且高效的方式表示数组、集合、记录和其他很多数据结构。 Lua语言也使用表来表示包&#xff08; package &am…...

01分数规划

https://ac.nowcoder.com/acm/contest/22353/1011 并不需要高级数据结构&#xff0c;对答案二分即可。 假定当前二分的答案为 x x x&#xff0c;则 ∑ v i ∑ w i ≥ x \frac{ \sum_{v_i} }{\sum_{w_i}} ≥ x ∑wi​​∑vi​​​≥x 成立时 x x x 才可能是最后的答案。 化简式…...

无人机动力系统全维度解析:技术演进、选型策略与未来趋势

一、动力系统技术理念与设计逻辑 &#xff08;一&#xff09;核心技术指标 能量密度&#xff1a;决定续航能力的关键参数&#xff0c;单位为 Wh/kg。当前主流锂聚合物电池能量密度约 250-300Wh/kg&#xff0c;氢燃料电池可达 500-800Wh/kg&#xff0c;航空燃油则高达 12,000W…...

重新审视中国的GB标准(44495 – 44497)

此前&#xff0c;我们深入探讨了中国新推出的智能互联汽车(ICV)网络安全标准GB Standard 44495-2024。我们探讨了该标准对汽车制造商的影响、与UNECE R155和ISO/SAE 21434等全球标准的一致性&#xff0c;以及该标准对未来汽车网络安全的意义。 然而&#xff0c;GB 44495-2024并…...

Linux进程控制(五)之做一个简易的shell

文章目录 做一个简易的shell预备知识代码实现运行结果 做一个简易的shell 重谈Shell shell是操作系统的一层外壳程序&#xff0c;帮我们用户执行指令&#xff0c; 获取到指令后&#xff0c;交给操作系统&#xff0c;操作系统执行完后&#xff0c;把执行结果通过shell交给用户…...

Apache Kafka全栈技术解析

目录 第一章 Kafka概述与核心价值 1.1 消息队列的演进与Kafka的诞生 1.2 Kafka的核心应用场景 1.3 Kafka生态全景图 第二章 Kafka核心概念与架构解析 2.1 核心概念深度剖析 2.2 Kafka架构设计精要 第三章 Kafka环境搭建与配置 3.1 单机部署实战 3.2 集群部署最佳实践 …...

结合 Flink/Spark 进行 AI 大数据处理(实时数据 + AI 推理的应用场景)

随着企业对实时智能决策的需求日益增强,将 Flink / Spark 等流批计算框架 与 大模型推理能力相结合,正在成为 AI 工业化落地的重要实践路径。本篇文章将深入介绍如何将 AI 模型集成到大数据流处理系统中,实现实时感知、智能判断与自动反馈。 1. 为什么需要“实时数据 + AI 推…...

开发PDF时,如何比较 PDF 文件

在 PDF 论坛上&#xff0c;“如何比较 PDF 文件”是一个经常被提到的问题。在开始之前&#xff0c;重要的是要明确你想要比较的内容是什么。 不同的 PDF 文件可能看起来一样吗&#xff1f; 是的&#xff0c;可能。不同的 PDF 创建工具可能会生成在视觉上完全相同的页面&#x…...

自动提取pdf公式 ➕ 输出 LaTeX

# 创建打包脚本的主内容 script_content """ from doc2x.extract_formula import extract_formula_imgs from pix2text import Pix2Text from PIL import Image import osdef main():pdf_path "your_file.pdf" # 将你的PDF命名为 your_file.pdf 并…...

abaqus二次开发python程序集

abaqus二次开发python程序集 1、设置字体背景色等2、读取模态频率并写入 csv 文件3、在两个窗口快速对比各价模态 1、设置字体背景色等 # _*_ coding:UTF-8 _*_from abaqusConstants import* def fontsize(sessionNone):#设置字体session.viewports[Viewport: 1].viewportAnno…...

高级java每日一道面试题-2025年3月23日-微服务篇[Nacos篇]-如何使用Nacos进行服务发现?

如果有遗漏,评论区告诉我进行补充 面试官: 如何使用Nacos进行服务发现&#xff1f; 我回答: 在Java高级面试中讨论如何使用Nacos进行服务发现时&#xff0c;可以从多个角度深入探讨&#xff0c;包括基本概念、配置步骤、代码示例以及高级特性。以下是综合了多种信息的详细回…...

k8s核心资源对象一(入门到精通)

本文将深入探讨Kubernetes中的核心资源对象&#xff0c;包括Pod、Deployment、Service、Ingress、ConfigMap和Secret&#xff0c;详细解析其概念、功能以及实际应用场景&#xff0c;帮助读者全面掌握这些关键组件的使用方法。 一、pod 1 pod概念 k8s最小调度单元&#xff0c;…...

了解 DeepSeek R1

了解DeepSeek R1 R1探索纯强化学习是否可以在没有监督微调的情况下学会推理的能力。 ‘Aha’ Moment 这种现象有点类似于人类在解决问题时突然意识到的方式&#xff0c;以下是它的工作原理&#xff1a; 初始尝试&#xff1a;模型对解决问题进行初始尝试识别&#xff1a;识别…...

【C语言】大小端字节序和字节序判断

前言&#xff1a; 在上章介绍了整形在内存的储存&#xff0c;了解了原码&#xff0c;反码&#xff0c;补码&#xff0c;知道了整数在内存的储存一般是补码&#xff0c;解决了负数相加的问题。 那么在本章为大家讲解一下大小端字节序。 一那字节序是什么呢&#xff1f; 字节…...

DrissionPage移动端自动化:从H5到原生App的跨界测试

一、移动端自动化测试的挑战与机遇 移动端测试面临多维度挑战&#xff1a; 设备碎片化&#xff1a;Android/iOS版本、屏幕分辨率差异 混合应用架构&#xff1a;H5页面与原生组件的深度耦合 交互复杂性&#xff1a;多点触控、手势操作、传感器模拟 性能监控&#xff1a;内存…...

ARM 汇编启动代码详解:从中断向量表到中断处理

ARM 汇编启动代码详解&#xff1a;从中断向量表到中断处理 引言 在嵌入式系统开发中&#xff0c;ARM 处理器&#xff08;如 Cortex-A 系列&#xff09;的启动代码是系统初始化和运行的基础。启动代码通常包括中断向量表的创建、初始化硬件状态&#xff08;如关闭缓存和 MMU&a…...

笔试专题(七)

文章目录 乒乓球筐&#xff08;哈希&#xff09;题解代码 组队竞赛题解代码 删除相邻数字的最大分数&#xff08;线性dp&#xff09;题解代码 乒乓球筐&#xff08;哈希&#xff09; 题目链接 题解 1. 两个哈希表 先统计第一个字符串中的字符个数&#xff0c;再统计第二个字…...

React基础知识(一)

文章目录 概念特点React基本使用hello_react案例虚拟DOM的两种创建方式使用jsx创建使用js创建 虚拟DOM和真实DOM React jsxXMLjsx语法规则作用基本语法规则js语句和js代码babel.js作用 模块与组件模块组件 React面向组件编程函数式组件类组件 概念 react是一个将数据渲染为Htm…...

红黑树(Red-Black Tree)核心知识点与面试高频问题

红黑树&#xff08;Red-Black Tree&#xff09;核心知识点与面试高频问题 一、红黑树的核心性质 红黑树是一种自平衡的二叉搜索树&#xff0c;通过以下规则确保平衡性&#xff1a; 节点颜色&#xff1a;每个节点是红色或黑色。 根节点&#xff1a;根必须是黑色。 叶子节点&a…...

SpringBoot整合SSM

一、SpringBoot整合SSM SpringBoot整合SpringSpringBoot整合SpringMVCSpringBoot整合MyBatis&#xff08;主要&#xff09; 步骤一&#xff1a;创建SpringBoot工程&#xff0c;添加druid依赖 <!-- todo 1 添加druid连接池依赖--> <dependency><groupId>co…...

set/multiset容器

1.概念 所有元素会在插入时自动排序 set/multiset属于关联式容器&#xff0c;底层结构是用二叉树实现。 set不允许重复元素&#xff0c;multiset允许重复元素。 2. set构造和赋值 set<T> st; set(const set &st);// 拷贝构造函数 set& operator(const set &a…...

vim 编辑器 使用教程

Vim是一款强大的文本&#xff08;代码&#xff09;编辑器&#xff0c;它是由Bram Moolenaar于1991年开发完成。它的前身是Bill Joy开发的vi。名字的意义是Vi IMproved。 打开vim&#xff0c;直接在命令行输入vim即可&#xff0c;或者vim <filename>. Vim分为四种模式&a…...

去中心化固定利率协议

核心机制与分类 协议类型&#xff1a; 借贷协议&#xff08;如Yield、Notional&#xff09;&#xff1a;通过零息债券模型&#xff08;如fyDai、fCash&#xff09;锁定固定利率。 收益聚合器&#xff08;如Saffron、BarnBridge&#xff09;&#xff1a;通过风险分级或博弈论…...

Python高阶函数-filter

1. 基本概念 filter() 是Python内置的高阶函数&#xff0c;用于过滤序列中的元素。它接收一个函数和一个可迭代对象作为参数&#xff0c;返回一个迭代器&#xff0c;包含使函数返回True的所有元素。 filter(function, iterable)2. 工作原理 惰性计算&#xff1a;filter对象是…...

hive/doris查询表的创建和更新时间

hive查询表的创建和更新时间&#xff1a; SELECT d.NAME AS database_name, t.TBL_NAME AS table_name, FROM_UNIXTIME(t.CREATE_TIME) AS create_time, FROM_UNIXTIME(tp.PARAM_VALUE) AS last_ddl_time FROM metastore.TBLS t JOIN metastore.DBS d ON t.DB_ID d.DB_ID JOIN…...

40常用控件_WindowFrame的影响

window frame 的影响 如果 widget 作为一个窗口(带有标题栏,最小化,最大化,关闭按钮),那么在计算尺寸和坐标的 时候就有两种算法.包含 window frame 和 不包含 window frame. 其中x(),y0,frameGeometry(), pos(),move() 都是按照包含 window frame 的方式来计算 的. 其中 geome…...

PCB 赋能机器人技术革新:核心功能与前沿趋势

一、智能控制中枢的异构集成 采用 20 层刚挠结合板架构&#xff0c;搭载 NVIDIA Jetson AGX Orin SoC&#xff08;100TOPS 算力&#xff09;&#xff0c;集成 64 位 ARMv8 内核与 32GB 内存&#xff0c;实现多模态传感器数据融合与实时决策。板载 128MB DDR4 缓存支持 μs 级响…...

unity 环形UI菜单实现方法2

在项目中需要一个环形UI并且循环往复的效果&#xff0c;这个方法思路为提前预设好位置&#xff0c;让UI根据坐标预设的移动&#xff0c;然后使用mask遮罩达到循环往复效果的目的。 下图分别分为了三个列表 第一个列表poslist是提前预设的位置 第二个列表为背景暂时不用看 第三个…...

Redis进阶--主从复制

目录 一、引言 二、介绍 三、解决问题 四、配置主从复制 1.复制 全量复制&#xff1a; 部分复制&#xff1a; 实时复制&#xff1a; 五、总结 一、引言 本篇文章将继续介绍Redis中的主从复制机制 二、介绍 主从复制是在分布式系统中实现的&#xff0c;希望有多个服务器…...

Redisson分布式锁:原理、使用

1. Redisson简介 Redisson是一个基于Redis的Java客户端库&#xff0c;提供了丰富的分布式对象和服务&#xff08;如分布式锁、信号量、Map等&#xff09;。其核心优势在于​​简化分布式锁的实现​​&#xff0c;并解决了原生Redis分布式锁的常见问题&#xff08;如死锁、误删…...

Java设计模式之外观、享元、组合模式《三国争霸:模式风云录》

第一章&#xff1a;乱世起&#xff08;外观初现&#xff09; 黄巾余孽张角三兄弟操控"混沌子系统"&#xff0c;各地流民不堪996劳役。观国隐士诸葛孔明出山&#xff0c;在博望坡构建首个"军师智脑"&#xff1a; /​**​* 外观模式&#xff1a;军师智…...

设计模式之解释器模式:原理、实现与应用

引言 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一种语言的文法表示&#xff0c;并提供一个解释器来解释该语言中的句子。解释器模式适用于需要解析特定语法规则的场景&#xff0c;如正则表达式、SQL解析等。本文将深入…...

redis itheima

缓存问题 核心是如何避免大量请求到达数据库 缓存穿透 既不存在于 redis&#xff0c;也不存在于 mysql 的key&#xff0c;被重复请求 public Result queryById(Long id) {String key CACHE_SHOP_KEYid;// 1. redis & mysqlString shopJson stringRedisTemplate.opsFo…...

AF3 OpenFoldDataModule类setup方法解读

AlphaFold3 data_modules 模块的 OpenFoldDataLoader 类 setup 方法用于设置数据集的关键部分,负责根据不同的模式(训练、验证或预测)生成和初始化相应的数据集。 源代码: def setup(self, stage=None):# Most of the arguments are the same for the three datasets data…...

服务器报错:xxx/libc.so.6: version `GLIBC_2.32‘ not found

/lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32 not found (required by ./aima-sim-app-main) 解决思路 根据错误信息&#xff0c;您的应用程序 aima-sim-app-main 和 libmujoco.so.3.1.6 库依赖于较新的 GNU C Library (glibc) 版本&#xff08;如 GLIBC_2.32, GLIBC…...

FPGA状态机设计:流水灯实现、Modelsim仿真、HDLBits练习

一、状态机思想 1.概念 状态机&#xff08;Finite State Machine, FSM&#xff09;是计算机科学和工程领域中的一种抽象模型&#xff0c;用于描述系统在不同状态之间的转换逻辑。其核心思想是将复杂的行为拆解为有限的状态&#xff0c;并通过事件触发状态间的转移。 2.状态机…...

机试题——最少乘坐公交次数

题目描述 春节将近&#xff0c;小明想在节日期间逛一逛城里的 ( N ) 个著名景点。所有景点都能通过坐公交到达。需要设计一种公交路线方案&#xff0c;让小明能最快地逛完所有景点。 输入描述 第一行&#xff1a;一个整数 ( N )&#xff0c;表示景点数量&#xff0c;满足 ( …...

防孤岛保护装置在分布式光伏并网中的应用

什么是光伏的“孤岛效应” 孤岛islanding 包含负荷和电源的部分电网&#xff0c;从主网脱离后继续孤立运行的状态。孤岛可分为非计划性孤岛和计划性孤岛。 孤岛效应的危害 当电网侧停电检修&#xff0c;若并网光伏电站的逆变器仍在继续供电&#xff0c;维修人员不一定…...

记一次gitlab服务器负载过高问题处理

服务器上进程 /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru 进程服务器cpu占用过高应该怎么处理 tail -f /var/log/gitlab/gitlab-rails/production.log调整 Unicorn 配置&#xff1a;unicorn.rb 是 Unicorn 服务器的配…...

LiT and Lean: Distilling Listwise Rerankers intoEncoder-Decoder Models

文章&#xff1a;ECIR 2025会议 一、动机 背景&#xff1a;利用LLMs强大的能力&#xff0c;将一个查询&#xff08;query&#xff09;和一组候选段落作为输入&#xff0c;整体考虑这些段落的相关性&#xff0c;并对它们进行排序。 先前的研究基础上进行扩展 [14,15]&#xff0c…...

【项目日记】高并发服务器项目总结

生活总是让我们遍体鳞伤&#xff0c; 但到后来&#xff0c; 那些受伤的地方一定会变成我们最强壮的地方。 -- 《老人与海》-- 高并发服务器项目总结 模块关系图项目工具模块缓冲区模块通用类型模块套接字socket模块信道Channel模块多路转接Poller模块 Reactor模块时间轮Tim…...

P1332 血色先锋队(BFS)

题目背景 巫妖王的天灾军团终于卷土重来&#xff0c;血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团&#xff0c;以及一切沾有亡灵气息的生物。孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围&#xff0c;现在他们将主力只好聚集了起来&#xff0c;以抵…...

systemd 与 SysVinit

1. 什么是 systemd 和 SysVinit&#xff1f; systemd 和 SysVinit 都是 Linux 的初始化系统&#xff08;init system&#xff09;&#xff0c;用于管理系统启动、服务、进程和日志。 比较项SysVinitsystemd启动方式逐步启动&#xff08;串行&#xff09;并行启动&#xff08;…...