015枚舉之滑動窗口——算法備賽

滑動窗口

最大子數組和

題目描述

給你一個整數數組 nums ,請你找出一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。

原題鏈接

思路分析

見代碼注解

代碼

int maxSubArray(vector<int>& nums) {int numsSize=nums.size();int max=nums[0];int m=0;for(int i=1;i<numsSize;i++){m+=nums[i-1];   //m記錄前面區間窗口區間的總和if(m<0){m=0;  //當區間總和小于0時放棄不用,m置為0}if(m+nums[i]>max){max=m+nums[i];  //更新max值。}}return max;  //如果數組值都為非正數,則最大值為某個元素}

子數組操作后的最大頻數

問題描述

給你一個長度為 n 的數組 nums ,同時給你一個整數 k

你可以對 nums 執行以下操作 一次

  • 選擇一個子數組 nums[i..j] ,其中 0 <= i <= j <= n - 1
  • 選擇一個整數 x 并將 nums[i..j]所有 元素都增加 x

請你返回執行以上操作以后數組中 k最大 頻數。

子數組 是一個數組中一段連續 非空 的元素序列。

提示:

  • 1 <= n == nums.length <= 10^5
  • 1 <= nums[i] <= 50
  • 1 <= k <= 50

原題鏈接

思路分析

記數組中k的頻數為cnt,可以肯定答案最小不會小于cnt(將數組中所有元素加0得到)

將子數組中所有元素都加x,為最大化答案,最優策略就是將子數組中頻數最大的那個元素變為k(如果使對答案貢獻為負數,那就不能操作該子數組)。

定義m_max[i]記錄將元素i全變為k對答案的貢獻,maxn為所有m_max[i]的最大值,最后的答案就是cnt+maxn

具體實現時,再定義一個數組m,m[i]記錄將最后枚舉到的i的下標為操作的子數組的右邊界且將i都變為k的對答案的最大貢獻,枚舉到nums[i],當nums[i]==k時,將前面統計到的所有的大于0的m[j]都減1,因為后面再枚舉到j時,前面有一個k,對答案的貢獻要減1,貢獻本身就是0了就沒必要再減了

本題思路和上題最大子數組和的思路有點像。m[i]記錄的是前綴和(遇到i加一,遇到k減1),m_max[i]記錄的是i對應的最大子數組和。

代碼

int maxFrequency(vector<int>& nums, int k) {int ans=0,cnt=0,n=nums.size();vector<int>m(51);  vector<int>m_max(51);  //m_max[i]記錄將元素i全變為k對答案的貢獻int maxn=0;for(int i=0;i<n;i++){int t=nums[i];if(t==k){ cnt++;  //記錄k的個數for(int j=1;j<=50;j++) if(m[j]>0) m[j]--;}else m[t]++;m_max[t]=max(m[t],m_max[t]);  maxn=max(maxn,m_max[t]);}return cnt+maxn;}

滑動窗口最大值

問題描述

給你一個整數數組 nums,有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。

返回 滑動窗口中的最大值 數組,數組每個元素記錄了滑動窗口每個階段的最大值。

原題鏈接

思路分析

這題是滑動窗口的經典題。

定義一個單調隊列(雙端隊列實現),隊頭維護的是窗口的最大值,每次滑動將當前枚舉到的新元素nums[i]尾插入隊列,在插入前將影響單調的元素從尾部移除。

細節:當從隊頭取出元素時,有些元素可能已過期(不滿足當前窗口大小為k),需要從頭部移除,因為需要判斷元素是否過期,這知道元素的下標,所以單調隊列應該存儲下標值。

代碼

vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> arr;deque<int>q;for(int i=0;i<nums.size();i++){while(!q.empty()&&nums[q.back()]<nums[i]) q.pop_back();q.push_back(i);if(i>=k-1){while(q.front()<=i-k) q.pop_front();arr.push_back(nums[q.front()]);}}return arr;}

子矩陣

藍橋杯2023年省賽題

問題描述

給定一個n*m的矩陣。設矩陣的價值為所有數中最大值與最小值的乘積。求給定的所有大小為a*b的子矩陣的價值的和。

答案很大,請輸出答案對998244353的結果。

數據規模:

  • 1<=a<=n<=1000
  • 1<=b<=m<=1000
  • 1<=aij<=1^9

原題鏈接

思路分析

本題是滑動窗口最值的二維版本,請先回顧上題。

首先考慮暴力法,枚舉每個子矩陣,總復雜度接近O(n*m*a*b),是個天文數字,肯定不允許。從數據規模來看需要設計一個O(n*m)的算法。

類似求一維的固定長度的子數組的最值,本題是求二維的固定長寬的子矩陣的最值。

參考滑動窗口最大值,先預處理數據,將原矩陣的每一行看作一維數組,對每一行求滑窗最值,定義maxn[i][j]表示第i行第j個長度為b的滑動窗口的最大值,同理定義minn[i][j]表示第i行第j個長度為b的滑動窗口的最小值。

再在maxnminn的基礎上求滑動窗口的最大值和最小值,滑動窗口的大小為a,這樣通過橫向再縱向掃描的方式求解。

以求2*3子矩陣最大值為例,圖解:

在這里插入圖片描述

代碼中多次求解滑窗最值,可以定義getMin()getMax()來快速求解。

時間復雜度:單次求解滑窗最值是線性的時間復雜度,求解minn,maxn的復雜度為O(n*m),再在minn和maxn基礎上求解滑窗最值的時間復雜度為O(n*c)(c為minn和maxn的列寬即m-b),總時間復雜度為O(n*m+n*c)O(n*m*a*b)好多了。

代碼

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, m, a, b;
const int mod = 998244353;
vector<vector<int>>nums;  //存儲原數組
vector<vector<int>>maxn;  //maxn[i][j]存儲第i行第j個滑動窗口的最大值
vector<vector<int>>minn;  //maxn[i][j]存儲第i行第j個滑動窗口的最小值
void getMin(vector<int>& tar, vector<int>& mats, int k) {  //求解滑動窗口最小值的子問題deque<int>dq;for (int i = 0; i < mats.size(); i++) {while (!dq.empty() && mats[dq.back()] > mats[i]) dq.pop_back();dq.push_back(i);if (i >= k - 1) {while (dq.front() <= i - k) dq.pop_front();tar.push_back(mats[dq.front()]);}}
}
void getMax(vector<int>& tar, vector<int>&mats, int k) {  //求解滑動窗口最大值的子問題deque<int>dq;for (int i = 0; i < mats.size(); i++) {while (!dq.empty() && mats[dq.back()] < mats[i]) dq.pop_back();dq.push_back(i);if (i >= k - 1) {while (dq.front() <= i - k) dq.pop_front();tar.push_back(mats[dq.front()]);}}
}
void init() {cin >> n >> m >> a >> b;nums = vector<vector<int>>(n, vector<int>(m));minn.resize(n);maxn.resize(n);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> nums[i][j];}}
}
int solve() {ll ans = 0;for (int i = 0; i < n; i++) getMax(maxn[i], nums[i], b);for (int i = 0; i < n; i++) getMin(minn[i], nums[i], b);int cols = maxn[0].size();vector<int>sMax, sMin;  //子矩陣的最大最小值vector<int>temp(n);for (int j = 0; j < cols; j++) {for (int i = 0; i < n; i++) temp[i] = maxn[i][j];sMax.clear();  //容器清空,達到復用的目的,節省空間getMax(sMax, temp, a);for (int i = 0; i < n; i++) temp[i] = minn[i][j];  //同上sMin.clear();getMin(sMin, temp, a);for (int i = 0; i < sMin.size(); i++) {ans = (ans + ((ll)sMax[i] * sMin[i]) % mod) % mod;}}return ans;
}
int main() {ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);init();cout << solve();return 0;
}

最小區間

問題描述

你有 k非遞減排列 的整數列表。找到一個 最小 區間,使得 k 個列表中的每個列表至少有一個數包含在其中。

我們定義如果 b-a < d-c 或者在 b-a == d-ca < c,則區間 [a,b][c,d] 小。

原題鏈接

思路分析

首先將列表中元素(額外記錄所在區間)裝進一個集合count中并按升序排好序,定義一個左邊界left,右邊界right,先正向遍歷右邊界,直到所有列表中的元素都至少出現一次,然后正向遍歷左邊界直到存在一個列表的元素沒出現,將當前滿足要求的區間[nums[left],nums[right]]與歷史最優值比較并更新歷史最優值。

從小到大遍歷右邊界尋找最大的左邊界,確保計算了每個可能更新歷史最值的答案。

代碼

vector<int> smallestRange(vector<vector<int>>& nums) {vector<pair<int, int>> count;int k = nums.size();for(int i = 0; i < k; ++i){for(auto num : nums[i])count.push_back({num, i});}sort(count.begin(), count.end());  //基本有序的排序,時間復雜度為O(nk)int ans_left = 0, ans_right = INT_MAX;  //歷史最優值vector<int> map(k);  //map[i]統計第i個列表在當前區間出現了多少次int kinds = 0;  //統計有多少個列表的至少一個元素出現for(int left = 0, right = 0; right < count.size(); ++right){if(!map[count[right].second]++) kinds++;  //在自增之前判斷是否為0while(kinds == k){if(count[right].first - count[left].first < ans_right - ans_left){  //更新歷史最值ans_right = count[right].first;ans_left = count[left].first;}if(--map[count[left++].second] == 0) kinds--;  //自減之后判斷是否為0}}return {ans_left, ans_right};}

時間復雜度O(nk)

最小覆蓋子串

問題描述

給你一個字符串 s 、一個字符串 t 。返回 s 中涵蓋 t 所有字符的最小子串。如果 s 中不存在涵蓋 t 所有字符的子串,則返回空字符串 ""

原題鏈接

注意:

  • 對于 t 中重復字符,我們尋找的子字符串中該字符數量必須不少于 t 中該字符數量。
  • 如果 s 中存在這樣的子串,我們保證它是唯一的答案。

思路分析

首先考慮一下暴力一點的方法

定義l,r [l,r]表示當前遍歷到的區間窗口

定義一個字符表table儲存區間內的字符的頻數,當區間中的t中的某字符的頻數都達標時,在不破壞達標條件的前提下逐漸向右移動左邊界l

此時的r-l+1是以r為右邊界的最小達標子串,每遍歷一次r更新歷史最小長度值和起始左邊界。

上述思路,每遍歷到一個r就需要去table中挨個檢查每個字符的頻數是否達標,又要多一層循環,能不能優化一些呢?

我們可以先對table預處理,讓t中的字符對應的頻數的負數存進table,表示t中對應字符需要補充的數量

在后面正式右邊界遍歷時一共需要補充tLen(t字符串的長度)個目標字符。

每次只需在O(1)的時間復雜度下判斷tLen是否等于0即可判斷區間內目標字符頻數是否達標

右邊界每遍歷到一個字符,對應字符頻數+1,

頻數+1之前判斷該字符對應的頻數是否為負數(表示該字符需要補充),是負數則tLen-1表示已補充一個目標字符,

當tLen減為0時,表示目標字符全部補充完(即窗口區間中t對應的字符數都達標),此時便在不破壞達標條件的前提下逐漸向右移動左邊界(對應的字符頻數大于0則減1且右移l,)。

當tlen減為0時,由于移動左右邊界都不破壞達標條件,table存儲的每個字符頻數始終大于等于0,tLen便一直為0了(待補充目標字符數為0)。

代碼

    int table[26]={0};int start=-1;int leng=INT_MAX;string minWindow(string s, string t) {for (int i = 0; i < t.length(); i++) {  //存儲字符表table[t[i]-'A']--;}for (int l = 0, r = 0,debt=t.length(); r < s.length(); r++) {  //枚舉右邊界if ((table[s[r]-'A']++)< 0) debt--;  //debt減到0后不會再減if (debt == 0) {while (table[s[l]-'A'] > 0) table[s[l++]-'A']--;  //table[i]最減到0后不會再減if (r - l + 1 < leng) {leng = r - l + 1;  //更新最小長度start = l;  //更新起始索引}}}return start == -1 ? "" : s.substr(start, leng);}

數據流的中位數

問題描述

中位數是有序整數列表中的中間值。如果列表的大小是偶數,則沒有中間值,中位數是兩個中間值的平均值。

  • 例如 arr = [2,3,4] 的中位數是 3
  • 例如 arr = [2,3] 的中位數是 (2 + 3) / 2 = 2.5

實現 MedianFinder 類:

  • MedianFinder() 初始化 MedianFinder 對象。
  • void addNum(int num) 將數據流中的整數 num 添加到數據結構中。
  • double findMedian() 返回到目前為止所有元素的中位數。與實際答案相差 10-5 以內的答案將被接受。

原題鏈接

思路分析

定義一個升序的優先隊列(大根堆)queMin,隊列中的所有元素都小于等于當前集合的中位數。

定義一個降序序的優先隊列(小根堆)queMax,隊列中的所有元素都大于當前集合的中位數。

每往集合添加一個數x

  • x小于等于queMin堆頂或queMin為空,則將x添加進queMin,添加完后,判斷queMin的大小大于queMax的大小+1(此時小于等于中位數的個數過多),則將queMin的堆頂元素移動到queMax
  • 否則,將x添加進queMax,添加完后,判斷queMax的大小大于queMin的大小(此時大于中位數的個數過多),則將queMax的堆頂元素移動到queMin

返回當前集合的中位數,若queMin的大小大于queMax,則返回queMin的堆頂元素,否則返回queMin堆頂元素和queMax堆頂元素的平均值。

代碼

class MedianFinder {
public:priority_queue<int>queMin;  //升序,隊頭為最大值priority_queue<int,vector<int>,greater<int>>queMax;  //降序,隊頭為最小值MedianFinder() {}void addNum(int num) {if (queMin.empty() || num <= queMin.top()) {queMin.push(num);if (queMax.size() + 1 < queMin.size()) {queMax.push(queMin.top());  //將小于等于中位數隊列中的最大值移動到大于中位數隊列queMin.pop();}} else {queMax.push(num);if (queMax.size() > queMin.size()) {queMin.push(queMax.top());  //將大于中位數隊列中的最小值移動到小于等于中位數隊列queMax.pop();}}}double findMedian() {if(queMin.size()>queMax.size()) return queMin.top();return ((double)queMin.top()+(double)queMax.top())/2;}
};

滑動窗口中位數

問題描述

中位數是有序序列最中間的那個數。如果序列的長度是偶數,則沒有最中間的數;此時中位數是最中間的兩個數的平均數。

例如:

  • [2,3,4],中位數是 3
  • [2,3],中位數是 (2 + 3) / 2 = 2.5

給你一個數組 nums,有一個長度為 k 的窗口從最左端滑動到最右端。窗口中有 k 個數,每次窗口向右移動 1 位。你的任務是找出每次窗口移動后得到的新窗口中元素的中位數,并輸出由它們組成的數組。
原題鏈接
思路分析

我們首先思考一下完成本題需要做哪些事情:

  • 初始時,我們需要將數組 nums 中的前 k 個元素放入一個滑動窗口,并且求出它們的中位數;

  • 隨后滑動窗口會向右進行移動。每一次移動后,會將一個新的元素放入滑動窗口,并且將一個舊的元素移出滑動窗口,最后再求出它們的中位數。

因此,我們需要設計一個「數據結構」,用來維護滑動窗口,并且需要提供如下的三個接口:

  • insert(num):將一個數 num 加入數據結構;

  • erase(num):將一個數 num 移出數據結構;

  • getMedian():返回當前數據結構中所有數的中位數。

使用兩個優先隊列(堆)維護所有的元素,第一個優先隊列 small 是一個大根堆,它負責維護所有元素中較小的那一半;第二個優先隊列 large 是一個小根堆,它負責維護所有元素中較大的那一半。(參考上一題)

延遲刪除

對于insert添加元素來說比較簡單,然而對于 erase(num) 而言,設計起來就不是那么容易了,因為我們知道,優先隊列是不支持移出非堆頂元素這一操作的,因此我們可以考慮使用「延遲刪除」的技巧

當我們需要移出優先隊列中的某個元素時,我們只將這個刪除操作「記錄」下來,而不去真的刪除這個元素。當這個元素出現在 small 或者 large 的堆頂時,我們再去將其移出對應的優先隊列。

「延遲刪除」使用到的輔助數據結構一般為哈希表 delayed,其中的每個鍵值對 (num,freq),表示元素 num 還需要被刪除 freq 次。

我們首先設計一個輔助函數 prune(heap),它的作用很簡單,就是對 heap 這個優先隊列(small 或者 large 之一),不斷地彈出其需要被刪除的堆頂元素,并且減少 delayed 中對應項的值。在 prune(heap) 完成之后,我們就可以保證 heap 的堆頂元素是不需要被「延遲刪除」的。

在 prune(heap) 的基礎上設計另一個輔助函數 makeBalance(),它的作用即為調整 small 和 large 中的元素個數,使得二者的元素個數滿足要求,即small.size()-large.size()的值為0或1。調整策略如下:

  • 如果 small 和 large 中的元素個數滿足要求,則不進行任何操作;

  • 如果 small 比 large 的元素個數多了 2 個,那么我們我們將 small 的堆頂元素放入 large。此時 small 的對應元素可能是需要刪除的,因此我們調用 prune(small);

  • 如果 small 比 large 的元素個數少了 1 個,那么我們將 large 的堆頂元素放入 small。此時 large 的對應的元素可能是需要刪除的,因此我們調用 prune(large)。

此時,我們在原先 insert(num) 的設計的最后加上一步 makeBalance() 調整兩個優先隊列大小即可。

對于erase(num)還需進一步思考:

  • 如果 num 與 small 和 large 的堆頂元素都不相同,那么 num 是需要被「延遲刪除」的,我們將其在哈希表中的值增加 1;

  • 否則,例如 num 與 small 的堆頂元素相同,那么該元素是可以理解被刪除的。雖然我們沒有實現「立即刪除」這個輔助函數,但只要我們將 num 在哈希表中的值增加 1,并且調用「延遲刪除」的輔助函數 prune(small),那么就相當于實現了「立即刪除」的功能。

無論是「立即刪除」還是「延遲刪除」,其中一個優先隊列中的元素個數(這里指的是當前包含的個數,實際大小扣除延遲刪除的個數)都發生了變化(減少了 1),因此我們還需要用 makeBalance() 調整元素的個數。

此時,所有的接口都已經設計完成了。由于 insert(num) 和 erase(num) 的最后一步都是 makeBalance(),而 makeBalance() 的最后一步是 prune(heap),因此我們就保證了任意操作完成之后,small 和 large 的堆頂元素都是不需要被「延遲刪除」的,且兩個堆的元素個數符合要求。

具體實現的細節相對較多,讀者可以參考下面的代碼和注釋進一步理解。

代碼

class DualHeap {
private:// 大根堆,維護較小的一半元素priority_queue<int> small;// 小根堆,維護較大的一半元素priority_queue<int, vector<int>, greater<int>> large;// 哈希表,記錄「延遲刪除」的元素,key 為元素,value 為需要刪除的次數unordered_map<int, int> delayed;int k;// small 和 large 當前包含的元素個數,扣除被「延遲刪除」的元素int smallSize, largeSize;public:DualHeap(int _k): k(_k), smallSize(0), largeSize(0) {}private:// 不斷地彈出 heap 的堆頂元素,并且更新哈希表template<typename T>  //標記為模版函數void prune(T& heap) {while (!heap.empty()) {int num = heap.top();if (delayed.count(num)) {--delayed[num];if (!delayed[num]) {  //延遲刪除數減為0,不需要再刪除delayed.erase(num);}heap.pop();}else {break;}}}// 調整 small 和 large 中的元素個數,使得二者的元素個數滿足要求//即 small.size()-large.size()的值為0或1void makeBalance() {if (smallSize > largeSize + 1) {// small 比 large 元素多 2 個large.push(small.top());small.pop();--smallSize;++largeSize;// small 堆頂元素被移除,堆頂元素變化,需要進行 pruneprune(small);}else if (smallSize < largeSize) {// large 比 small 元素多 1 個small.push(large.top());large.pop();++smallSize;--largeSize;// large 堆頂元素被移除,堆頂元素變化,需要進行 pruneprune(large);}}public:void insert(int num) {if (small.empty() || num <= small.top()) {small.push(num);++smallSize;}else {large.push(num);++largeSize;}makeBalance();}void erase(int num) {++delayed[num];if (num <= small.top()) {--smallSize;if (num == small.top()) {prune(small);}}else {--largeSize;if (num == large.top()) {prune(large);}}makeBalance();}double getMedian() {return k & 1 ? small.top() : ((double)small.top() + large.top()) / 2;}
};class Solution {
public:vector<double> medianSlidingWindow(vector<int>& nums, int k) {DualHeap dh(k);for (int i = 0; i < k; ++i) {dh.insert(nums[i]);}vector<double> ans = {dh.getMedian()};for (int i = k; i < nums.size(); ++i) {dh.insert(nums[i]);dh.erase(nums[i - k]);ans.push_back(dh.getMedian());}return ans;}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83083.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83083.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83083.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微軟系統 紅帽系統 網絡故障排查:ping、traceroute、netstat

在微軟&#xff08;Windows&#xff09;和紅帽&#xff08;Red Hat Enterprise Linux&#xff0c;RHEL&#xff09;等系統中&#xff0c;網絡故障排查是確保系統正常運行的重要環節。 ping、traceroute&#xff08;在Windows中為tracert&#xff09;和netstat是三個常用的網絡…

解構認知邊界:論萬能方法的本體論批判與方法論重構——基于跨學科視閾的哲學-科學辯證

一、哲學維度的本體論批判 &#xff08;1&#xff09;理性主義的坍縮&#xff1a;從笛卡爾幻想到哥德爾陷阱 笛卡爾在《方法論》中構建的理性主義范式&#xff0c;企圖通過"普遍懷疑-數學演繹"雙重機制確立絕對方法體系。然而哥德爾不完備定理&#xff08;Gdel, 19…

【網絡入侵檢測】基于源碼分析Suricata的IP分片重組

【作者主頁】只道當時是尋常 【專欄介紹】Suricata入侵檢測。專注網絡、主機安全&#xff0c;歡迎關注與評論。 目錄 目錄 1.概要 2. 配置信息 2.1 名詞介紹 2.2 defrag 配置 3. 代碼實現 3.1 配置解析 3.1.1 defrag配置 3.1.2 主機系統策略 3.2 分片重組模塊 3.2.1…

二分查找的邊界問題

前言 二分查找(Binary Search)是一種高效的查找算法&#xff0c;時間復雜度為O(log n)。它適用于已排序的數組或列表。本文將詳細介紹二分查找的兩種常見寫法&#xff1a;閉區間寫法和左閉右開區間寫法。 一、二分查找基本思想 二分查找的核心思想是"分而治之"&am…

重慶醫科大學附屬第二醫院外科樓外擋墻自動化監測

1.項目概述 重慶醫科大學附屬第二醫院&#xff0c;重醫附二院&#xff0c;是集醫療、教學、科研、預防保健為一體的國家三級甲等綜合醫院。前身為始建于1892年的“重慶寬仁醫院”。醫院現有開放床位 1380張&#xff0c;年門診量超過百萬人次&#xff0c;年收治住院病人4.5萬人…

【Redis實戰篇】秒殺優化

1. 秒殺優化-異步秒殺思路 我們來回顧一下下單流程 當用戶發起請求&#xff0c;此時會請求nginx&#xff0c;nginx會訪問到tomcat&#xff0c;而tomcat中的程序&#xff0c;會進行串行操作&#xff0c;分成如下幾個步驟 1、查詢優惠卷 2、判斷秒殺庫存是否足夠 3、查詢訂單…

【idea】調試篇 idea調試技巧合集

前言&#xff1a;之前博主寫過一篇idea技巧合集的文章&#xff0c;由于技巧過于多了&#xff0c;文章很龐大&#xff0c;所以特地將調試相關的技巧單獨成章, 調試和我們日常開發是息息相關的&#xff0c;用好調試可以事半功倍 文章目錄 1. idea調試異步線程2. idea調試stream流…

postman 用法 LTS

postman 用法 LTS File ---- View ---- Show Postman Console

MySQL 數據庫故障排查指南

MySQL 數據庫故障排查指南 本指南旨在幫助您識別和解決常見的 MySQL 數據庫故障。我們將從問題識別開始&#xff0c;逐步深入到具體的故障類型和排查步驟。 1. 問題識別與信息收集 在開始排查之前&#xff0c;首先需要清晰地了解問題的現象和范圍。 故障現象&#xff1a; 數…

用AI寫簡歷是否可行?

讓AI批量寫簡歷然后投簡歷是絕對不行的&#xff01;&#xff01;&#xff01; 為什么不行&#xff0c;按照 "招聘經理" 工作經歷舉例&#xff1a; ai提示詞&#xff1a;請幫我寫一份招聘經理的工作經歷內容&#xff1a; 招聘經理 | XXX科技有限公司 | 2020年…

【從零實現JsonRpc框架#1】Json庫介紹

1.JsonCpp第三方庫 JSONCPP 是一個開源的 C 庫&#xff0c;用于解析和生成 JSON&#xff08;JavaScript Object Notation&#xff09;數據。它提供了簡單易用的接口&#xff0c;支持 JSON 的序列化和反序列化操作&#xff0c;適用于處理配置文件、網絡通信數據等場景。 2.Jso…

Ubuntu——執行echo $USE什么都不顯示

問題&#xff1a;“執行 echo $USER 什么都不顯示”&#xff1f; 一、原因分析 環境變量 $USER 未正確設置 $USER 是系統自動定義的環境變量&#xff0c;通常用于表示當前登錄的用戶名。若該變量未設置或為空&#xff0c;執行 echo $USER 會無輸出。可能場景&#xff1a; 用戶通…

uni-app學習筆記五--vue3插值表達式的使用

vue3快速上手導航&#xff1a;簡介 | Vue.js 模板語法 插值表達式 最基本的數據綁定形式是文本插值&#xff0c;它使用的是“Mustache”語法 (即雙大括號)&#xff1a; <span>Message: {{ msg }}</span> 雙大括號標簽會被替換為相應組件實例中 msg 屬性的值。同…

【PSINS工具箱】基于工具箱的單獨GNSS導航、單獨INS導航、兩者結合組合導航,三種導航的對比程序。附完整的代碼

本文給出基于PSINS工具箱的單獨GNSS導航、單獨INS導航、兩者結合組合導航(153EKF)的程序。并提供三者的軌跡對比、誤差對比。 文章目錄 運行結果MATLAB代碼代碼的簡單介紹簡介2. 平均絕對誤差 (MAE)主要模塊運行結果 三軸軌跡圖: 各軸誤差曲線: 命令行窗口的結果輸出: …

C. scanf 函數基礎

scanf 函數 1. scanf 函數基礎1.1 函數原型與頭文件1.2 格式化輸入的基本概念2.1 常見格式說明符整數格式說明符浮點數格式說明符字符和字符串格式說明符其他格式說明符2.2 格式說明符的高級用法寬度修飾符精度修飾符跳過輸入字段寬度組合修飾符對齊修飾符實際應用示例3.2 精度…

spring cloud loadbalancer實現機房感知的負載均衡

1 概述 在同城多機房情景下&#xff0c;各個機房各自部署一套微服務集群&#xff0c;正常情況下微服務調用在本機房閉環。在如下某些災難情景&#xff0c;可以嘗試拉遠調用以最大程度維持業務連續性&#xff0c;這些情景例如&#xff1a; A機房多個服務器宕機。應用由于BUG發…

vue中,created和mounted兩個鉤子之間調用時差值受什么影響

在 Vue 中&#xff0c;created 和 mounted 是兩個生命周期鉤子&#xff0c;它們之間的調用時差主要受以下幾個因素影響&#xff1a; &#x1f7e2; 1. 模板復雜度與渲染耗時&#xff08;最主要因素&#xff09; mounted 的觸發時間是在組件的 DOM 被掛載之后&#xff08;也就是…

Linux篇 第2章Linux基礎指令

Linux篇 第2章Linux基礎指令 文章目錄 前言一、基礎的一些命令1.pwd2.mkdir3.ls4.cd5.clear 二、ls1.ls -l2.ls -a3.ls -l -a 三、touch四、 cd1.cd /2.cd ..3.cd ~4. cd - 五、tree1. Linux系統文件的結構2.絕對路徑和相對路徑 六、mkdir -p七、rmdir&#xff08;沒啥用&#…

Scrapyd 詳解:分布式爬蟲部署與管理利器

Scrapyd 是 Scrapy 官方提供的爬蟲部署與管理平臺&#xff0c;支持分布式爬蟲部署、定時任務調度、遠程管理爬蟲等功能。本文將深入講解 Scrapyd 的核心功能、安裝配置、爬蟲部署流程、API 接口使用&#xff0c;以及如何結合 Scrapy-Redis 實現分布式爬蟲管理。通過本文&#x…

國產免費工作流引擎star 6.5k,Warm-Flow升級1.7.2(新增案例和修復缺陷)

文章目錄 主要更新內容項目介紹功能思維導圖設計器流程圖演示地址官網Warm-Flow視頻 主要更新內容 [feat] 開啟流程實例&#xff0c;新增流程定義是否存在校驗[feat] 新增合同簽訂流程案例[feat] 新增企業采購流程案例[update] mybatis-plus邏輯刪除&#xff0c;刪除值和未刪除…