【LeetCode 面试经典150题】详细题解之滑动窗口篇
【LeetCode 面试经典150题】详细题解之滑动窗口篇
- 1 滑动窗口理论基础
- 1.1 算法思想
- 1.2 使用场景
- 1.3 使用思路
- 2 209.长度最小的子数组
- 2.1 题目分析
- 2.2 算法步骤
- 2.3 代码实现
- 2.4 时间复杂度
- 3 3.无重复字符的最长字串
- 3.1 题目分析
- 3.2 算法步骤
- 3.3 代码实现
- 3.4 复杂度分析
- 4 30.串联所有单词的子串
- 4.1 题目分析
- 4.2 算法步骤
- 4.3 代码实现
- 4.4 复杂度分析
- 5 76.最小覆盖子串
- 5.1 题目分析
- 5.2 算法步骤
- 5.3 代码实现
- 5.4 复杂度分析
1 滑动窗口理论基础
1.1 算法思想
一个固定大小的窗口在数据序列上滑动,并在窗口内执行特定操作的问题。
通俗的讲就是,对于数组,维持一个特定窗口/动态可变窗口,通过该窗口来在数组或者字符串上进行操作。
字面意思上理解:
滑动 : 窗口时移动的,就是按照一定方向来进行移动
窗口:窗口大小并不是固定的,而是不断扩容直到满足一定条件;也可以不断缩小,找到满足条件的最小窗口;也可以固定大小。
1.2 使用场景
- 满足xx条件(计算结果,出现次数,同时包含)
- 最长/最短
- 子串/子数组/子序列
感觉是你认为需要在一个数组/字符串中维持一个滑动的窗口来解题的题,都可以用滑动窗口来解决。
1.3 使用思路
寻找最长
核心:左右双指针(l.r), [ l , r ] [l,r] [l,r]即为窗口内的元素。r为窗口的结束位置,l为窗口的起始位置。
每次滑动过程中:窗内元素满足条件,r向右移动扩大窗口,更新最优结果;窗内元素不满足条件,L向右移动缩小窗口。
模板如下:
int l = 0; // 窗内的起始位置
for(int r = 0;r<n;r++){ // 窗口的终止位置while(窗内元素不满足条件){窗口缩小:移除l对应的元素,l右移}更新最优结果到bestResult中;
}
return bestResult
寻找最短
核心:左右双指针(l.r), [ l , r ] [l,r] [l,r]即为窗口内的元素。r为窗口的结束位置,l为窗口的起始位置。
每次滑动过程中:窗内元素不满足条件,r向右移动扩大窗口;窗内元素满足条件,L向右移动缩小窗口,更新最优结果。
模板如下
int l = 0; // 窗内的起始位置
for(int r = 0;r<n;r++){ // 窗口的终止位置while(窗内元素满足条件){更新最优结果bestResult // 因为要找最短的,所以满足条件后还需要窗口缩小,寻找到最短的最优结果窗口缩小:移除l对应的元素,l右移}
}
return bestResult
实现滑动窗口时,需要确定如下几点
- 窗口内是什么
- 如何移动窗口的起始位置
- 如何移动窗口的结束位置
以209长度最小的子数组为例
窗口内:满足和>=s的长度最小的连续子数组
起始位置如何移动:如果当前窗口值>=s,窗口需要缩小
for (int r = 0; r < n; r++) { // 枚举右端点ans += nums[r];while (ans >= target) { // 需要缩短子数组的长度,找到最短的子数组res = Math.min(res, r - l + 1);ans -= nums[l];l++;}}
结束位置如何移动:结束位置就是遍历数组的指针,也就是for循环的索引
2 209.长度最小的子数组
209. 长度最小的子数组
中等
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的
子数组
[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度**。**如果不存在符合条件的子数组,返回 0
。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4]
输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
提示:
1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 104
进阶:
- 如果你已经实现
O(n)
时间复杂度的解法, 请尝试设计一个O(n log(n))
时间复杂度的解法。
2.1 题目分析
可以暴力求解,但是时间复杂度市 O ( n 2 ) O(n^2) O(n2)。这里可以使用滑动窗口来求解。
滑动窗口是一种处理数组子区间问题的有效方法,它的核心思想是通过两个指针 l
和 r
来表示一个窗口,这个窗口内的数值总和是我们关心的属性。
2.2 算法步骤
- 初始化:定义两个指针
l
和r
,分别代表窗口的左右边界,初始时都指向数组的开始位置。定义ans
来存储当前窗口的和,res
用来存储满足条件的最短子数组的长度,初始值设为Integer.MAX_VALUE
,表示一个很大的数。 - 窗口扩张:遍历数组,每次将
r
指针向右移动一位,并将nums[r]
加到ans
中。这样,ans
就代表了从l
到r
的窗口内所有元素的和。 - 窗口缩小:如果
ans
大于等于target
,说明当前窗口内的和已经满足或超过了目标值,此时尝试缩小窗口以找到更短的子数组。将l
指针向右移动一位,并将nums[l]
从ans
中减去,这样ans
就代表了从l+1
到r
的窗口内所有元素的和。 - 更新结果:每次窗口缩小后,如果
ans
仍然大于等于target
,则更新res
的值,取r-l+1
和res
中的较小值作为新的res
。 - 循环结束:重复步骤 2 和 3,直到
r
指针遍历完整个数组。 - 返回结果:如果
res
仍然是Integer.MAX_VALUE
,说明没有找到满足条件的子数组,返回 0;否则返回res
。
2.3 代码实现
class Solution {public int minSubArrayLen(int target, int[] nums) {int n = nums.length;int l = 0, ans = 0, res = Integer.MAX_VALUE;for (int r = 0; r < n; r++) { // 枚举右端点ans += nums[r];while (ans >= target) { // 需要缩短子数组的长度,找到最短的子数组res = Math.min(res, r - l + 1);ans -= nums[l];l++;}}return res == Integer.MAX_VALUE ? 0 : res;}
}
2.4 时间复杂度
- 时间复杂度:O(n),其中 n 是数组
nums
的长度。这是因为每个元素最多被访问两次(一次是窗口扩张,一次是窗口缩小)。 - 空间复杂度:O(1),除了输入数组外,我们只需要常数级别的额外空间。
3 3.无重复字符的最长字串
3. 无重复字符的最长子串
中等
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
3.1 题目分析
滑动窗口的方法来解决。滑动窗口在这里指的是一个动态的子串区间,这个区间内的字符都是唯一的。
窗口内需要满足的条件:窗口内的字符必须是唯一的。所以可以用一个hashset来记录窗口内出现的字符,确保唯一性。
滑动窗口的移动:
- 窗口扩张:当当前字符不在窗口中时,将字符添加到窗口的哈希表中,并向右移动右指针
r
,窗口扩张。 - 窗口缩小:如果当前字符已经在窗口中,说明出现了重复,需要移动左指针
l
来缩小窗口,直到当前字符不再出现在窗口中。
3.2 算法步骤
-
初始化:定义两个指针
l
和r
,分别代表窗口的左右边界,初始时都指向字符串的开始位置。定义一个哈希表set
来存储窗口内的字符,以及两个变量res
和curres
分别用来存储最长不重复子串的长度和当前窗口的长度。 -
遍历字符串:通过右指针
r
遍历字符串。- 检查重复:在每次迭代中,首先检查当前字符
s.charAt(r)
是否已经在哈希表set
中。如果在,说明出现了重复,需要缩小窗口。- 窗口缩小:如果出现重复,通过
while
循环,不断移除左指针l
指向的字符,并右移l
,直到当前字符不再出现在窗口中。
- 窗口缩小:如果出现重复,通过
- 窗口扩张:将当前字符
s.charAt(r)
添加到哈希表set
中,并更新当前窗口长度curres
。 - 更新结果:每次窗口扩张后,比较并更新
res
的值,取res
和curres
中的较大值作为新的res
。
- 检查重复:在每次迭代中,首先检查当前字符
-
返回结果:遍历结束后,返回
res
作为最长不重复子串的长度。
3.3 代码实现
class Solution {public int lengthOfLongestSubstring(String s) {/**维护一个滑动窗口滑动窗口内没有重复的字符当当前滑动窗口内,无重复字符时,右指针右移,窗口扩张存在重复字符时,左指针右移,窗口缩小滑动窗口范围为[l,r]*/int n = s.length();int l = 0;Set<Character> set = new HashSet<>();int res = 0;int curres = 0;for(int r = 0;r<n;r++){while(set.contains(s.charAt(r))){set.remove(s.charAt(l));l++;curres--;}set.add(s.charAt(r));curres ++;res = Math.max(res,curres);}return res;}
}
3.4 复杂度分析
- 时间复杂度:O(n),其中 n 是字符串
s
的长度。这是因为每个字符最多被访问两次(一次是窗口扩张,一次是窗口缩小)。 - 空间复杂度:O(min(n, m)),其中 n 是字符串
s
的长度,m 是字符集的大小。在最坏的情况下,哈希表需要存储所有不同的字符。
4 30.串联所有单词的子串
30. 串联所有单词的子串
困难
给定一个字符串 s
和一个字符串数组 words
。 words
中所有字符串 长度相同。
s
中的 串联子串 是指一个包含 words
中所有字符串以任意顺序排列连接起来的子串。
- 例如,如果
words = ["ab","cd","ef"]
, 那么"abcdef"
,"abefcd"
,"cdabef"
,"cdefab"
,"efabcd"
, 和"efcdab"
都是串联子串。"acdbef"
不是串联子串,因为他不是任何words
排列的连接。
返回所有串联子串在 s
中的开始索引。你可以以 任意顺序 返回答案。
示例 1:
输入:s = "barfoothefoobarman", words = ["foo","bar"]
输出:[0,9]
解释:因为 words.length == 2 同时 words[i].length == 3,连接的子字符串的长度必须为 6。
子串 "barfoo" 开始位置是 0。它是 words 中以 ["bar","foo"] 顺序排列的连接。
子串 "foobar" 开始位置是 9。它是 words 中以 ["foo","bar"] 顺序排列的连接。
输出顺序无关紧要。返回 [9,0] 也是可以的。
示例 2:
输入:s = "wordgoodgoodgoodbestword", words = ["word","good","best","word"]
输出:[]
解释:因为 words.length == 4 并且 words[i].length == 4,所以串联子串的长度必须为 16。
s 中没有子串长度为 16 并且等于 words 的任何顺序排列的连接。
所以我们返回一个空数组。
示例 3:
输入:s = "barfoofoobarthefoobarman", words = ["bar","foo","the"]
输出:[6,9,12]
解释:因为 words.length == 3 并且 words[i].length == 3,所以串联子串的长度必须为 9。
子串 "foobarthe" 开始位置是 6。它是 words 中以 ["foo","bar","the"] 顺序排列的连接。
子串 "barthefoo" 开始位置是 9。它是 words 中以 ["bar","the","foo"] 顺序排列的连接。
子串 "thefoobar" 开始位置是 12。它是 words 中以 ["the","foo","bar"] 顺序排列的连接。
提示:
1 <= s.length <= 104
1 <= words.length <= 5000
1 <= words[i].length <= 30
words[i]
和s
由小写英文字母组成
4.1 题目分析
这个问题要求找出所有包含特定单词集合 words
的子串的起始索引。这里的关键是使用滑动窗口的方法来高效地检查每个可能的子串,同时使用哈希表来跟踪单词的出现频次。
- 单词频次映射:首先,我们需要记录
words
数组中每个单词的出现频次,这可以通过一个哈希表(Map
)来实现。 - 滑动窗口:使用滑动窗口来遍历字符串
s
,窗口内包含words
数组中所有单词的一个或多个实例。 - 窗口初始化:对于每种可能的单词划分方式,初始化窗口,并检查第一个窗口是否包含
words
数组中的所有单词。 - 窗口滑动:在确认第一个窗口后,继续滑动窗口,每次移动时更新窗口内的单词频次,并检查是否满足条件。
- 条件检查:如果窗口内的单词频次与
words
数组中的频次完全匹配,则记录窗口的起始索引。
4.2 算法步骤
- 初始化变量:
n
:words
数组中每个单词的长度。m
:words
数组的长度,即单词的数量。ls
:字符串s
的长度。res
:用来存储所有满足条件的子串起始索引的列表。
- 遍历划分方式:
- 对于字符串
s
中的每种可能的单词划分方式,检查是否能够形成words
数组中的单词。
- 对于字符串
- 初始化滑动窗口:
- 对于每种划分方式,从
s
中取出m
个单词,并记录它们的出现频次。
- 对于每种划分方式,从
- 检查
words
数组中的单词:- 遍历
words
数组,更新窗口内单词的频次,如果频次减至0,则从哈希表中移除该单词。
- 遍历
- 滑动窗口遍历字符串
s
:- 继续遍历字符串
s
,每次移动窗口时,添加新进入窗口的单词,并移除离开窗口的单词。 - 如果在任何时候哈希表为空,说明当前窗口包含了
words
数组中的所有单词,记录下当前窗口的起始索引。
- 继续遍历字符串
- 返回结果:
- 返回所有满足条件的子串起始索引的列表。
4.3 代码实现
class Solution {public List<Integer> findSubstring(String s, String[] words) {/**是438 字母异位词的变体逻辑上差不多438 题中的步骤如下1.初始化pcnt和scnt数组,记录出现的频次2.初始化滑动窗口,判断第一个窗口是否满足。3.for遍历,判断其他窗口是否满足pcnt和scnt相等。本题差不多,只是不再用cnt来记录两个字符串的字母出现频次,而是用Map,此外,本题中也不再是记录单个字母的出现频次,而是记录单词。最后,由于是单词,所以还要考虑不同的划分方法比如barfoothefoobarman有三种划分方式bar foo the foo bar manb arf oot efo oba rma nba rfo oth efo oba arm an遍历这三种划分方式,遍历的时,先初始化最开始的滑动窗口,判断第一个窗口是否满足,之后开始for遍历s数组,判断s的其他窗口是否也满足。*/int n = words[0].length(); // words中字符串的长度,一共有n种划分方式int m = words.length; // words 字符串数组的长度,用来遍历字符串,计算Mapint ls = s.length(); // 字符串s的长度List<Integer> res = new ArrayList<>();for(int i = 0;i<n;i++){ // n种划分方式//2.0 注意这里,只有当i+m*n <=ls 时,i才会有效if(i+m*n > ls){break;}// 2.1 初始化滑动窗口Map<String,Integer> map = new HashMap<>();// 2.1.1 从s中取出m个单词for(int j = 0;j<m;j++){String word = s.substring(i+j*n,i+(j+1)*n);map.put(word,map.getOrDefault(word,0)+1);}// 2.1.2 遍历words,假如map中存在words中的word,那么map[word]--,最后将map中对应单词出现次数为0的单词全部移除,假如map为空,则说明是一个串联子串for(String word:words){map.put(word,map.getOrDefault(word,0)-1);if(map.get(word)==0){map.remove(word);}}if(map.isEmpty()){res.add(i);}for(int start = i+n;start<=ls-m*n;start+=n){String word = s.substring(start+(m-1)*n,start+m*n);map.put(word,map.getOrDefault(word,0)+1);if(map.get(word)==0){map.remove(word);}word = s.substring(start-n,start);map.put(word,map.getOrDefault(word,0)-1);if(map.get(word)==0){map.remove(word);}if(map.isEmpty()){res.add(start);}}}return res;}
}
4.4 复杂度分析
- 时间复杂度:O(m * n * (ls - m * n + 1)),在最坏的情况下,我们需要遍历整个字符串
s
多次,每次遍历都需要检查m
个单词。 - 空间复杂度:O(m),用于存储单词的哈希表。
5 76.最小覆盖子串
76. 最小覆盖子串
困难
给你一个字符串 s
、一个字符串 t
。返回 s
中涵盖 t
所有字符的最小子串。如果 s
中不存在涵盖 t
所有字符的子串,则返回空字符串 ""
。
注意:
- 对于
t
中重复字符,我们寻找的子字符串中该字符数量必须不少于t
中该字符数量。 - 如果
s
中存在这样的子串,我们保证它是唯一的答案。
示例 1:
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。
示例 2:
输入:s = "a", t = "a"
输出:"a"
解释:整个字符串 s 是最小覆盖子串。
示例 3:
输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。
提示:
m == s.length
n == t.length
1 <= m, n <= 105
s
和t
由英文字母组成
**进阶:**你能设计一个在 o(m+n)
时间内解决此问题的算法吗?
5.1 题目分析
使用滑动窗口技术,通过动态调整窗口大小来寻找包含字符串 t
所有字符的 s
的最小子串,并利用哈希表高效地进行字符频次比较和更新。
用两个Map存储一个Map ori 存储t中所有字符出现的次数一个Map cnt 存储滑动遍历s时滑动窗口内,所有字符出现的次数使用一个Check函数比较ori和cnt两个map,比较对于ori中的所有字符,cnt中是不是都出现并并且出现次数>= ori中的滑动规则则为:check函数满足:当前s的子串能涵盖t的所有字符,记录当前子串,左指针左移不满足则右指针右移
5.2 算法步骤
- 字符频次统计:首先,使用两个哈希表
ori
和cnt
分别存储目标字符串t
中所有字符的出现次数和当前滑动窗口内字符的出现次数。 - 滑动窗口初始化:初始化两个指针
l
和r
,分别代表滑动窗口的左右边界。 - 窗口扩张:通过移动右指针
r
来扩张窗口,直到窗口内包含了t
中所有字符的所需数量。 - 窗口缩小:当窗口满足条件后(即包含了
t
中所有字符的所需数量),开始移动左指针l
来缩小窗口,寻找更小的满足条件的子串。 - 检查函数:使用一个
check
函数来比较ori
和cnt
两个哈希表,检查当前窗口是否包含了t
中所有字符的所需数量。 - 结果更新:每当找到一个满足条件的窗口时,比较并更新记录的最小子串。
5.3 代码实现
需要注意的点
Map的遍历
for(Map.Entry<Character,Integer> entry:ori.entrySet()){Character key = entry.getKey();Integer num = entry.getValue();// 放其他代码}
Map设置默认值
cnt.getOrDefault(s.charAt(r),0)+1)
class Solution {Map<Character,Integer> ori = new HashMap<>();Map<Character,Integer> cnt = new HashMap<>();public String minWindow(String s, String t) {int ls = s.length();int lt = t.length();if(ls<lt){return "";}//1.构建ori中的值,ori存储t中所有字符出现的次数for(int i = 0;i<lt;i++){ori.put(t.charAt(i),ori.getOrDefault(t.charAt(i),0)+1);}//2使用滑动窗口遍历s,[l,r)int l = 0;int res = Integer.MAX_VALUE;String resstr = "";for(int r = 0;r<ls;r++){cnt.put(s.charAt(r),cnt.getOrDefault(s.charAt(r),0)+1);while(check()){if(r-l+1<res){resstr = s.substring(l,r+1);res = r-l+1;}cnt.put(s.charAt(l),cnt.getOrDefault(s.charAt(l),0)-1);l++;}}return resstr;}boolean check(){for(Map.Entry<Character,Integer> entry:ori.entrySet()){Character key = entry.getKey();Integer num = entry.getValue();if(cnt.get(key)==null || cnt.get(key)<num){return false;}}return true;}
}
5.4 复杂度分析
- 时间复杂度:O(ls + lt),在最坏的情况下,我们需要遍历整个字符串
s
和t
。 - 空间复杂度:O(lt),用于存储字符频次的哈希表。
相关文章:
【LeetCode 面试经典150题】详细题解之滑动窗口篇
【LeetCode 面试经典150题】详细题解之滑动窗口篇 1 滑动窗口理论基础1.1 算法思想1.2 使用场景1.3 使用思路 2 209.长度最小的子数组2.1 题目分析2.2 算法步骤2.3 代码实现2.4 时间复杂度 3 3.无重复字符的最长字串3.1 题目分析3.2 算法步骤3.3 代码实现3.4 复杂度分析 4 30.串…...
【 CSS 】sass 扩展语言的安装
一、全局安装node-sass Sass世界上最成熟、稳定和强大的CSS扩展语言 | Sass中文网 https://www.npmjs.com/package/node-sass NPM镜像_NPM下载地址_NPM安装教程-阿里巴巴开源镜像站 注意:nodejs版本14以上,否则node-sass安装不成功 npm install -g mi…...
【Linux】Linux中用户信息相关的配置文件:/etc/passwd、/etc/group、/etc/shadow、/etc/sudoers
1 用户信息 1.1 /etc/passwd linux上用户的信息保存在/etc/passwd中,看文件名会以为这里保存的是用户密码,但实际上用户密码保存在另一个文件中。 /etc/passwd文件中每行保存一个用户的信息,例如: root:x:0:0:root:/root:/bin…...
electron-vite_18 设置系统音量loudness报错
loudness是一款控制系统音量输出的一款 Node.js 库;但是在electron-vite中直接使用编译的时候会报错;这个时候需要单独处理; 错误分析 error Error: spawn E:\xxx\out\main\adjust_get_current_system_volume_vista_plus.exe 查看编译后项目…...
springboot测试类里注入不成功且运行报错
目录 出错信息 原因 出错信息 写测试类的时候,一直说我注入不成功 而且我运行的时候报错了 java.lang.IllegalStateException: Unable to find a SpringBootConfiguration, you need to use ContextConfiguration or SpringBootTest(classes...) with your te…...
Harmony 网络请求
Http数据请求 axios第三方网络请求工具 1.下载ohpm 2.安装axios 3.使用axios...
Webpack在Vue CLI中的应用
webpack 作为目前最流行的项目打包工具,被广泛使用于项目的构建和开发过程中,其实说它是打包工具有点大材小用了,我个人认为它是一个集前端自动化、模块化、组件化于一体的可拓展系统,你可以根据自己的需要来进行一系列的配置和安…...
docker-componse集群部署Tdengine3.3.2.0
一、centos7.5集群部署三台机器使用docker-componse进行部署 1、三台服务器分别配置host vim /etc/hosts 192.168.13.244 td.master 192.168.13.245 td.slave1 192.168.12.70 td.slave2 2、...
4.3 数据库HAVING语句
having子句要和group by子句联合起来才能使用,不能单独去使用,接下来咱们看一下为什么要引入having子句语法呢?引入having子句也是出于无奈,因为有些条件查询,用group by子句并不能满足要求,比如说查询部门…...
如何使用React,透传各类组件能力/属性?
在23年的时候,我主要使用的框架还是Vue,当时写了一篇“如何二次封装一个Vue3组件库?”的文章,里面涉及了一些如何使用Vue透传组件能力的方法。在我24年接触React之后,我发现这种扩展组件能力的方式有一个专门的术语&am…...
C# 6.0版本的WebAPI接口部署到Linux服务器
将 C# 6.0 的 Web API 部署到 Linux 服务器涉及多个步骤,包括准备环境、构建和发布应用程序、配置 Web 服务器以及确保应用程序正常运行。以下是详细的部署指南: 1. 准备开发环境 安装 .NET SDK 确保你已经在本地开发环境中安装了 .NET SDK(…...
ArkTs组件(2)
一.下拉列表组件:Select 1.接口 Select(options: Array<SelectOption>) 参数名类型必填说明optionsArray<SelectOption>是设置下拉选项。 SelectOption对象说明 名称类型必填说明valueResourceStr是 下拉选项内容。 iconResourceStr否 下拉选项图片…...
Bash 脚本教程
注:本文为 “Bash 脚本编写” 相关文章合辑。 BASH 脚本编写教程 as good as well于 2017-08-04 22:04:28 发布 这里有个老 American 写的 BASH 脚本编写教程,非常不错,至少没接触过 BASH 的也能看懂! 建立一个脚本 Linux 中有…...
SQL创建和操纵表
本文介绍创建、更改和删除表的基本知识。 1. 创建表 SQL 不仅用于表数据操纵,而且还用来执行数据库和表的所有操作,包括表本身的创建和处理。一般有两种创建表的方法: 多数DBMS 都具有交互式创建和管理数据库表的工具;表也可以…...
1.微服务灰度发布(方案设计)
前言 微服务架构中的灰度发布(也称为金丝雀发布或渐进式发布)是一种在不影响现有用户的情况下,逐步将新版本的服务部署到生产环境的策略。通过灰度发布,你可以先将新版本的服务暴露给一小部分用户或特定的流量,观察其…...
QT笔记- QTreeView + QFileSystemModel 当前位置的保存与恢复 #选中 #保存当前索引
保存当前位置 QString currentPath model->filePath(view->currentIndex()); // 获得当前位置路径 恢复位置 view->setCurrentIndex(model->index(currentPath)); // 设置此路径所在位置为当前位置...
LeetCode - Google 校招100题 第6天 回溯法(Backtracking) (8题)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144743505 LeetCode 合计最常见的 112 题: 校招100题 第1天 链表(List) (19题)校招100题 第2天 树(Tree) (21题)校招100题 第3天 动态规划(DP) (20题)...
k8s,service如何找到容器
Kubernetes之所以需要Service,一方面是因为Pod的IP不是固定的,另一方面则是因为一组Pod实例之间总会有负载均衡的需求 被selector选中的Pod,就称为Service的Endpoints,查看方式: kubectl get endpoints hostnames需要…...
计算机的错误计算(一百九十二)
摘要 用两个大模型计算 csc(0.999), 其中,0.999是以弧度为单位的角度,结果保留5位有效数字。两个大模型均给出了 Python代码与答案。但是,答案是错误的。 例1. 计算 csc(0.999), 其中,0.999是以弧度为单位的角度,结…...
金仓数据库安装-Kingbase v9-centos
在很多年前有个项目用的金仓数据库,上线稳定后就没在这个项目了,只有公司的开发环境还在维护,已经好多年没有安装过了,重温一下金仓数据库安装,体验一下最新版本,也做一个新版本的试验环境; 一、…...
深入解析 Java 中的 getDeclaredMethods() 方法:使用与原理全攻略
在 Java 的反射机制中,getDeclaredMethods() 是一个非常重要的方法,它允许我们获取类中声明的所有方法(包括公共、私有、保护以及默认访问权限的方法)。通过这个方法,我们可以动态地分析和操作类的行为,这在…...
Dockerfile的用法
Dockerfile的用法 示例 `Dockerfile`使用 `Dockerfile` 创建 Docker 镜像`Dockerfile` 指令详解其他常用指令总结Dockerfile 是一个文本文件,包含了用于创建 Docker 镜像的一系列指令。这些指令描述了镜像的基础、所安装的软件、文件的复制、环境变量的设置以及其他配置。下面…...
Gmsh有限元网格剖分(Python)---点、直线、平面的移动
Gmsh有限元网格剖分(Python)—点、直线、平面的移动和旋转 最近在学习有限元的网格剖分算法,主要还是要参考老外的开源Gmsh库进行,写一些博客记录下学习过程,方便以后回忆嘞。 Gmsh的官方英文文档可以参考:gmsh.pdf 但咋就说&a…...
AI的进阶之路:从机器学习到深度学习的演变(三)
(承接上集:AI的进阶之路:从机器学习到深度学习的演变(二)) 四、深度学习(DL):机器学习的革命性突破 深度学习(DL)作为机器学习的一个重要分支&am…...
如何通过 360 驱动大师检查自己电脑上的显卡信息
在深入探讨如何查看显卡信息之前,首先需要了解显卡的基本概念。显卡(Graphics Processing Unit, GPU),是计算机中负责处理图形输出到显示器的重要硬件。根据其集成度和性能,显卡通常被分为两类: 集成显卡&…...
数据仓库工具箱—读书笔记02(Kimball维度建模技术概述04、使用一致性维度集成)
Kimball维度建模技术概述 记录一下读《数据仓库工具箱》时的思考,摘录一些书中关于维度建模比较重要的思想与大家分享🤣🤣🤣 第二章前言部分作者提到:技术的介绍应该通过涵盖各种行业的熟悉的用例展开(赞同…...
.net framework wpf 打包免安装exe文件
1、打开所在项目csproj文件添加以下内容: <Target Name"AfterResolveReferences"><ItemGroup><EmbeddedResource Include"(ReferenceCopyLocalPaths)" Condition"%(ReferenceCopyLocalPaths.Extension) .dll"><…...
瑞吉外卖项目学习笔记(八)修改菜品信息、批量启售/停售菜品
瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现 瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息 瑞吉外卖项目学习笔记(四)TableField(fill FieldFill.INSERT)公共字…...
Oracle 日常巡检
1. 检查服务器状态 1.1. CPU使用情况 1.1.1. top top 命令是 Linux 和 Unix 系统中用于显示实时系统状态的工具,特别是对于监控 CPU 和内存的使用非常有用。 在命令行中输入 top,top 会显示一个实时更新的界面,其中包含系统的关键指标&am…...
CS 144 check7: putting it all together
Exercises 经验:两边的TCP连接建立得尽快,如果服务器端启动了,客户端没有启动就连不上。。 服务器端: 客户端: 文件收发测试: 参考: CS 144CS144 | Winter 2024, Lab 0~7 记录࿰…...
springboot数据校验报错
目录 报错信息 原因 解决 报错信息 springboot在进行数据校验的时候ConfigurationProperties注解形式下Email报错 Caused by: javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint javax.validation.constraints.Email valid…...
mapbox基础,加载天地图矢量底图
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象…...
SLAM/数字图象处理基础
概念 视差:相同特征的不同深度估计的偏差 BoW,DBoW,DBoW2的区别是什么 Bag of Words (BoW)、DBoW(Dynamic Bag of Words)和DBoW2是用于图像处理和计算机视觉中的不同特征表示和匹配方法。它们之间的主要区别如下&am…...
修改vue-element-admin,如何连接我们的后端
改哪几个文件就可以连接我们后端 主要就这四个 main.js,屏蔽这个或者删除 vue-config 最后两个文件改下端口即可 这样基本就能发了,但是还要改下 改成api 然后还要修改request.js 这里改成我们返回的状态码 我讲一个东西很容易就懂了&…...
基于PLC的采摘机械手系统(论文+源码)
1系统方案设计 本次设计围绕基于PLC的采摘机械手系统进行设计, PLC即可编程控制器其是一种常见的微处理器,本次拟采用西门子是S7-200 PLC,一方面对整个设计从器件选型到I/O分配,图纸绘制等进行设计,另一方面还通过组态…...
使用ArcGIS/ArcGIS pro绘制六边形/三角形/菱形渔网图
在做一些尺度分析时,经常会涉及到对研究区构建不同尺度的渔网进行分析,渔网的形状通常为规则四边形。构建渔网的方法也很简单,使用ArcGIS/ArcGIS Pro工具箱中的【创建渔网/CreateFishnet】工具来构建。但如果想构建其他形状渔网进行相关分析&…...
【5/6 面向应用相关的优化 网卡实现及评估 】
5 面向应用相关的优化 面对数据中心多样化的部署需求和应用场景,如分布式存储、多租户性能隔离等,构建高性能的RDMA系统需要仔细选择传输模式和通信原语以充分发挥其性能优势,并调整软硬件结构进行适配.整体手段:在软件层面结合R…...
如何识别钓鱼邮件和诈骗网站?(附网络安全意识培训PPT资料)
识别钓鱼邮件和诈骗网站是网络安全中的一个重要环节。以下是一些识别钓鱼邮件和诈骗网站的方法: 识别钓鱼邮件: 检查发件人地址: 仔细查看发件人的电子邮件地址,看是否与官方域名一致。 检查邮件内容: 留意邮件中是否…...
TOGAF之架构标准规范-业务架构
TOGAF标准规范中,业务架构阶段的主要工作是开发支持架构愿景的业务架构。 如上所示,业务架构(Business Architecture)在TOGAF标准规范中处于B阶段,该阶段的主要内容包括阶段目标、阶段输入、流程步骤、架构方法。 阶段…...
嵌入式轻量级开源操作系统:HeliOS的使用
嵌入式轻量级开源操作系统:HeliOS的使用 📍项目地址:https://github.com/heliosproj/HeliOS HeliOS项目是一个社区交付的开源项目,用于构建和维护HeliOS嵌入式操作系统(OS)。HeliOS是一个功能齐全的操作系统࿰…...
mysql 数据库迁移到达梦数据库
1.windows安装达梦数据库,去官网下载 dm8 进行安装,安装后,可以使用管理工具管理数据 使用迁移工具对数据进行迁移; 2.使用php 或者 thinkphp连接达梦数据库 2.1、先PHP开启DM扩展 从达梦数据库安装目录下drivers/php_pdo 复制对…...
Java中的异常处理机制
今天想和大家探讨Java中的异常处理机制。异常处理是任何编程语言中不可或缺的一部分,它帮助我们处理程序运行时可能出现的错误,确保程序的健壮性和稳定性。Java作为一种强类型、面向对象的编程语言,提供了一套完整的异常处理框架。 1. 异常的…...
iOS 苹果开发者账号: 查看和添加设备UUID 及设备数量
参考链接:苹果开发者账号下添加新设备UUID - 简书 如果要添加新设备到 Profiles 证书里: 1.登录开发者中心 Sign In - Apple 2.找到证书设置: Certificate,Identifiers&Profiles > Profiles > 选择对应证书 edit &g…...
数据仓库工具箱—读书笔记02(Kimball维度建模技术概述03、维度表技术基础)
Kimball维度建模技术概述 记录一下读《数据仓库工具箱》时的思考,摘录一些书中关于维度建模比较重要的思想与大家分享🤣🤣🤣 第二章前言部分作者提到:技术的介绍应该通过涵盖各种行业的熟悉的用例展开(赞同…...
Linux中常用的Shell脚本(运维+常用)汇总
废话不多说,直接上干货! 一、运维脚本 (1)监控CPU和内存的使用情况 #!/bin/bashcpu_threshold80 mem_threshold80# 获取CPU和内存使用率 cpu_usage$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.…...
Java 方法注释:规范、实用和高质量的写法
目录 为什么要注释方法? 方法注释的基本要求 Javadoc 注释格式 示例:一个计算圆面积的方法 代码示例 注释分析 如何写出高质量的 Java 方法注释? 1. 关注可读性 2. 使用 Javadoc 格式 3. 描述异常 4. 适当的解释复杂的算法 5. 避…...
解决JIRA、Confluence用户自动注销、反复登录的问题
一、问题描述:当工作从从confluence里面打开jira的时候,在回到confluence时候,就自动退出了,需要账号密码登录重复登录,使人十分厌恶。 二、原因分析: 访问 JIRA、Confluence 或任何其他具有相同域或 IP 上…...
Python9-作业2
记录python学习,直到学会基本的爬虫,使用python搭建接口自动化测试就算学会了,在进阶webui自动化,app自动化 python基础8-灵活运用顺序、选择、循环结构 作业2九九乘法表三种方式打印九九乘法表使用两个嵌套循环使用列表推导式和…...
基于c语言的union、字符串、格式化输入输出
结构体之共用体union 共用体也叫联合体,其关键词为union 与结构体不同的是,共用体所开辟的存储空间仅仅为其中最长类型变量的存储空间而不是全部变量的存储空间,由于同一内存单元在同一时间内只能存放其中一种的数据类型,因此在每…...
SpringCloudAlibaba实战入门之路由网关Gateway初体验(十)
Spring Cloud 原先整合 Zuul 作为网关组件,Zuul 由 Netflix 公司提供的,现在已经不维护了。后面 Netflix 公司又出来了一个 Zuul2.0 网关,但由于一直没有发布稳定版本,所以 Spring Cloud 等不及了就自己推出一个网关,已…...