【c++算法篇】滑動窗口

Alt

🔥個人主頁Quitecoder

🔥專欄算法筆記倉

Alt

目錄

  • `1.長度最小的子數組`
  • `2.無重復字符的最長子串`
  • `3.最大連續1的個數 III`
  • `4.將 x 減到 0 的最小操作數`
  • `5.水果成籃`
  • `6.找到字符串中所有字母異位詞`
  • `7.串聯所有單詞的子串`
  • `8.最小覆蓋子串`

滑動窗口是一種常用的算法技術,它適用于需要檢查序列(如數組或字符串)中的一系列連續元素的問題。通過維護序列中的一段特定大小的連續元素集,滑動窗口減少了不必要的重復計算,從而優化了性能。這種技術經常用于求解最大或者最小總和、長度滿足特定條件的子串或子數組的問題。

操作滑動窗口通常涉及以下幾個步驟:

  1. 初始化兩個指針,通常稱為 leftright,指向序列的起始部分,這定義了窗口的邊界。

  2. 根據問題的需要,將 right 指針向右移動以擴大窗口,直到窗口中的元素滿足特定條件(例如,元素總和達到目標值)。

  3. 當窗口中的元素滿足特定條件之后,可能需要將 left 指針向右移動以縮小窗口,并再次檢查條件是否滿足。在移動 left 指針的同時,我們可以更新相關的計算結果,如累積和或計數器等

  4. 在整個過程中,我們通常會記錄窗口相關的一些信息,如窗口大小、窗口內元素的總和、窗口中的最大或最小元素等,可能還會記錄與問題計算要求相關的最優結果

  5. 持續這個過程,有序地移動 leftright 指針,直到滑動窗口窮盡了整個序列的所有可能的連續元素集

一個常見的滑動窗口問題示例是找出一個數組中和至少為 target 的最短連續子數組,在這樣的問題中,滑動窗口技術能夠有效地找到解決方法,同時保證時間復雜度最少。

1.長度最小的子數組

題目鏈接:209. 長度最小的子數組
題目描述在這里插入圖片描述

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int right =0,left=0,len=INT_MAX;int sum=0;while(right<nums.size()){sum+=nums[right];while(sum>=target){len=min(len,right-left+1);sum-=nums[left++];}right++;}return len==INT_MAX?0:len;}
};

這段代碼解決的問題是尋找數組 nums 中和至少為 target 的最短連續子數組的長度。使用了滑動窗口方法,以下是它的邏輯和思路:

  1. 初始化兩個指針 leftright, 以及 sum 來存儲當前窗口中的元素和,和 len 來存儲最短子數組的長度。這里,len 初始化為 INT_MAX,表示一個非常大的數,用來保證能找到比初始值小的最小長度

  2. 使用外層 while 循環遍歷數組,右指針 right 逐漸向右移動,遍歷數組的每個元素

  3. 在每次迭代中,right 指向的當前元素加到 sum 中。這擴大了當前的滑動窗口,包括了 right 指向的新元素

  4. 出現滑動窗口中的和大于等于 target 時,進入內層 while 循環。在內層循環中:

    a. 通過 min(len, right-left+1) 更新 len 的值,以保持記錄最短連續子數組的長度。

    b. 嘗試縮小窗口從而找到可能的更短的連續子數組,方法是減去滑動窗口左端的元素值 nums[left],然后將左指針向右移動一位 (left++)

  5. 繼續執行外層 while 循環,右指針向右移動 (right++)。每次增加 right 時,重復上述過程,更新窗口中的元素和 sum,然后再次檢查窗口的和是否大于等于 target

  6. 當外層 while 循環結束時(即遍歷了所有元素),檢查最短長度 len 是否被更新過:如果 len 還是 INT_MAX,這意味著沒有找到滿足條件的子數組,函數返回 0;否則,返回找到的最短連續子數組的長度

這個時間復雜度是 O(n),因為每個元素最多被訪問兩次:一次是右指針向右移動時,另一次是左指針向右移動時

2.無重復字符的最長子串

題目鏈接:3. 無重復字符的最長子串
題目描述在這里插入圖片描述

class Solution {
public:int lengthOfLongestSubstring(string s) {int hash[128]={0};int left=0,right=0,len=0;while(right<s.size()){hash[s[right]]++;while(hash[s[right]]>1) hash[s[left++]]--;len=max(len,right-left+1);right++;}return  len;}
};

尋找給定字符串 s 中最長不含重復字符的子串的長度。使用滑動窗口,并在窗口內部跟蹤了字符的出現情況。具體思路:

  1. hash 數組用來維護每個 ASCII 字符在當前考慮的子串(滑動窗口)中的出現次數。它被初始化為0。

  2. leftright 兩個指針用來表示滑動窗口的邊界,初始時都指向字符串的開頭

  3. len 用來保持找到的最長不重復字符子串的長度

  4. 外層 while 循環用于移動 right 指針,這擴大了當前考慮的窗口

  5. 每次迭代中,hash 數組中增加 right 指向字符的計數

  6. 內層 while 循環檢查通過 right 新加入的字符是否導致了重復字符出現。如果是這樣,循環就使用 left 指針向前移動直到這個字符的計數再一次變為1

  7. 窗口內的字符統計更新后,計算當前窗口的長度并與之前的 len 比較,取較大者作為新的 len

  8. right 指針向前移動一位,以便包含當前右邊界的下一個字符。

  9. 外層循環直到 right 到達字符串的末尾結束,這時所有可能的窗口都已經被考慮。

  10. 最終 len 就是最長不重復字符子串的長度。

代碼結束時返回的 len 是所求的最長子串長度

3.最大連續1的個數 III

題目鏈接:1004. 最大連續1的個數 III
題目描述在這里插入圖片描述

class Solution {
public:int longestOnes(vector<int>& nums, int k) {int left=0,right=0,len=0,zero=0;while(right<nums.size()){if(nums[right]==0)zero++;while(k<zero){if(nums[left]==0) zero--,left++;else left++;}len=max(len,right-left+1);right++;}return len;  }
};

同樣的思路,用zero來記錄零的個數,如果zero大于二,移動左指針指導等于二位置,繼續將right向右移動,最后返回len的最大值

4.將 x 減到 0 的最小操作數

題目鏈接:1658.將 x 減到 0 的最小操作數
題目描述
在這里插入圖片描述

正難則反:

本題可以轉換為,求中間最長連續數組的和為數組總和減去x的結果

class Solution {
public:int minOperations(vector<int>& nums, int x) {int sum=0;for(int e:nums){sum+=e;}int des=sum-x;if(des<0)return -1;int left=0,right=0,len=-1,add=0;while(right<nums.size()){add+=nums[right];while(add>des){add-=nums[left++];}if(add==des){len=max(len,right-left+1);}right++;}return len==-1?-1:nums.size()-len;}
};

des是中間連續數組的目標求和值,add記錄連續子數組的和,如果和大于目標值,則讓add減去左指針指向的值并讓左指針移動,如果等于則記錄最大值,這里初始值給-1,如果沒有匹配的數組,則返回-1

5.水果成籃

題目鏈接:904.水果成籃
題目描述
在這里插入圖片描述

class Solution {
public:int totalFruit(vector<int>& fruits) {int hash[100001]={0};int left=0,right=0,len=0,kinds=0;while(right<fruits.size()){if(hash[fruits[right]]==0) kinds++;hash[fruits[right]]++;while(kinds>2){hash[fruits[left]]--;if(hash[fruits[left]]==0)kinds--;left++;}len=max(len,right-left+1);right++;}return len;}
};

在給定一個整數數組 fruits 的情況下,找到最長的連續子數組(窗口),其中只包含最多兩種不同的元素(即果樹種類)。這個問題可以用滑動窗口算法解決:

  1. hash 數組用來計數每種水果當前在窗口中的數量。

  2. 兩個變量 leftright 表示當前窗口(子數組)的兩端位置。

  3. len 用來記錄窗口的最大長度。

  4. kinds 用來記錄當前窗口中有多少種不同的水果

代碼的逐步邏輯:

  1. 外部 while 循環通過移動 right 指針向右擴展窗口,這樣就能包含新的元素(水果種類)。

  2. 如果當前 right 指針指向的水果種類之前未包含在窗口中(即 hash[fruits[right]] == 0),則增加 kinds 變量

  3. 然后增加該水果種類的計數(hash[fruits[right]]++

  4. 內部 while 循環檢查 kinds 是否超過了2。如果是這樣,這表示當前窗口包含了超過兩種水果,不符合題目條件。在這種情況下,需要縮小窗口(移動 left 指針)直到窗口中只包含兩種水果

  5. if(hash[fruits[left]] == 0)這句代碼檢查減去左指針后是否已經不包含這種水果,如果不包含,則種類數 kinds 需要減少

  6. 此次循環結束后,更新窗口長度的最大值 lenmax(len, right - left + 1))。

  7. 當所有元素都被擴展到窗口中后,right 指針繼續向右移動,讓外部循環繼續執行。

  8. 當循環結束時,len 中存儲的就是滿足條件的最大窗口長度

6.找到字符串中所有字母異位詞

題目鏈接:438.找到字符串中所有字母異位詞
題目描述在這里插入圖片描述

  • 因為字符串 p 的異位詞的長度?定與字符串 p 的?度相同,所以我們可以在字符串 s 中構
    造?個長度為與字符串 p 的長度相同的滑動窗?,并在滑動中維護窗?中每種字?的數量;
  • 當窗口中每種字母的數量與字符串 p 中每種字?的數量相同時,則說明當前窗口為字符串 p
    的異位詞;
  • 因此可以用兩個大小為 26 的數組來模擬哈希表,?個來保存 s 中的子串每個字符出現的個
    數,另?個來保存 p 中每?個字符出現的個數。這樣就能判斷兩個串是否是異位詞
class Solution {
public:vector<int> findAnagrams(string s, string p) {vector<int> result;  if (s.length() < p.length()) {return result;}int left = 0, right = 0, n = p.size(), count = 0;int hash1[26] = {0};int hash2[26] = {0};for (char e : p) {hash1[e - 'a']++;}while (right < s.length()) {hash2[s[right] - 'a']++;if (hash2[s[right] - 'a'] <= hash1[s[right] - 'a']) {count++;}if (right - left + 1 > n) {if (hash2[s[left] - 'a'] <= hash1[s[left] - 'a']) {count--;}hash2[s[left] - 'a']--;left++;}if (count == n) {result.push_back(left);}right++;}return result;}
};

  1. 首先檢查 s 的長度是否小于 p 的長度,如果小于,則直接返回空結果集,因為 p 的異位詞長度必定與 p 相等

  2. 定義并初始化兩個長度為 26 的數組 hash1hash2這兩個哈希表用于存儲字符 ‘a’ 到 ‘z’ 在字符串 p 和當前檢查的 s 的子串中出現的次數

  3. 遍歷字符串 p 并更新 hash1 表,其中 hash1[e - 'a']++ 表示將字符 ehash1 中的計數增加 1,用于記錄 p 里每個字符的頻率

  4. 使用兩個指針 leftright 定義滑動窗口的邊界。left 是窗口的起始位置,right 是窗口的結束位置,初始化時它們都是 0。變量 n 存儲字符串 p 的長度,count 用于記錄當前滑動窗口內字符頻率匹配 p 中的字符頻率的數量(即異位詞的字符計數)

  5. 開始遍歷字符串 s,同時動態更新 hash2 表,并增加 count 計數,表達式 hash2[s[right] - 'a']++ 用于更新 s 中當前字符的頻率

  6. 如果當前字符在 hash2 里的計數小于或等于 hash1 中的對應計數,count 增加 1,這意味著這個字符是 p 中的字符,并且在目前窗口中的出現頻率尚未超過 p 中的頻率

  7. 當滑動窗口的長度超過字符串 p 的長度時,必須移動窗口的左邊界。如果要移出窗口的字符的頻率在 hash2 中小于或等于 hash1,則減少 count 計數,并將 hash2[s[left] - 'a'] 減少 1,表示該字符從窗口中移除。

  8. 如果 countp 的長度相等,這意味著當前窗口是 p 的一個異位詞,將當前窗口的起始索引 left 添加到結果集中。

  9. 移動窗口的右邊界以檢查下一個字符。

  10. 當遍歷完成時,返回包含所有異位詞起始索引的 result

與前面不同的是,這道題的窗口大小可以看做是固定的,left每次向右移動保證了窗口大小

7.串聯所有單詞的子串

題目鏈接:30.串聯所有單詞的子串
題目描述在這里插入圖片描述

代碼思路:與上一道題類似,我們把每個words里面的元素當成一個整體,然后對s進行整體的劃分即可

class Solution {
public:vector<int> findSubstring(string s, vector<string>& words) {vector<int> ret;if(s.empty() || words.empty() || words[0].size() > s.size())return ret;unordered_map<string, int> hash1; // 保存 words 里面所有單詞的頻次for(auto& word : words) hash1[word]++;int len = words[0].size(), m = words.size();int i = 0;while(i < len) { // 執行 len 次unordered_map<string, int> hash2; // 維護窗口內單詞的頻次int left = i, right = i, count = 0;while(right + len <= s.size()) {// 進窗口 + 維護 countstring in = s.substr(right, len);if(hash1.count(in)) {hash2[in]++;if(hash2[in] <= hash1[in]) count++;}// 判斷if(right - left + 1 > len * m) {// 出窗口 + 維護 countstring out = s.substr(left, len);if(hash1.count(out) && hash2[out] > 0) {if(hash2[out] <= hash1[out]) count--;hash2[out]--;}left += len;}// 更新結果if(count == m) ret.push_back(left);right += len; // 窗口右端向右移動}i++; // 處理下一個子串開始位置}return ret;}
};

繼續構建兩個哈希表

“執行 len 次”是指,對滑動窗口處理的起始點進行遍歷,而遍歷的次數等于單詞的長度 len。每個單詞長度相同,這個長度用 len 變量表示

8.最小覆蓋子串

題目鏈接:76.最小覆蓋子串
題目描述在這里插入圖片描述

class Solution {
public:string minWindow(string s, string t) {string s1;if(s.size()<t.size())return s1;int hash1[128]={0};int hash2[128]={0};int kinds=0;int count=0;int len=INT_MAX;for(auto e:t){if(hash1[e]++ == 0) kinds++;}int left=0,right=0;int start=0;while(right<s.size()){hash2[s[right]]++;if(hash2[s[right]]==hash1[s[right]])count++;while(count==kinds){if(right - left + 1 < len) { len = right - left + 1;start = left; }hash2[s[left]]--;if(hash2[s[left]]<hash1[s[left]])count--;left++;}right++;}return len==INT_MAX?"":s.substr(start,len);}
};

思路:

  1. 預處理

    • 首先,檢查 s 的長度是否小于 t 的長度。若是,則無法包含所有 t 中的字符,直接返回空字符串。
    • 初始化兩個哈希數組 hash1hash2 來分別記錄 t 中每個字符的頻率和當前窗口中每個字符的頻率。數組大小設置為 128,以便覆蓋所有 ASCII 字符
  2. 記錄 t 中字符的頻率

    • 遍歷字符串 t,并使用 hash1 統計每個字符出現的頻率。
    • 如果字符 ehash1 中的頻率從 0 變為 1,意味著 t 中又有一個新的字符,因此將 kinds 計數加 1,kinds 表示 t 中不同字符的種類數。
  3. 初始化變量

    • 初始化計數器 count 為 0,用于記錄當前窗口已滿足的 t 中不同字符的數量。
    • 初始化 lenINT_MAX,用于記錄目前找到的最小窗口的長度。
    • 初始化指針 leftright 為 0,它們表示滑動窗口的左右邊界。
  4. 移動右指針 right

    • 使用 while 循環,移動右指針 right 來拓展當前窗口,直到涵蓋了 t 中的所有字符。
    • 增加 hash2[s[right]] 的值,表示當前字符在窗口中的計數增加。
    • 如果 s[right]hash2 中的計數與 hash1 中的計數相等,意味著至少包含了 t 中對應字符所要求的數量,count 加 1。
  5. 檢查并收縮窗口

    • countkinds 相等時,意味著當前窗口覆蓋了 t 中所有的字符。
    • 進入另一個 while 循環,盡可能縮小窗口大小,移動左指針 left,同時更新 lenstart 來記錄最小覆蓋子串的位置和長度。
    • 在移動 left 指針之后,將 hash2[s[left]] 相應的值減少。如果減少后 hash2[s[left]] 的值小于了 hash1[s[left]],意味著不能再移動 left 指針,因為移除的字符是 t 中必須有的字符,所以窗口不再滿足條件,需停止收縮。
  6. 移動右指針直到末尾

    • 繼續移動右指針 right,尋找下一個滿足條件的窗口。
  7. 返回結果

    • 當右指針遍歷完 s 后,檢查記錄的 len 是否變化,如果為 INT_MAX,表示沒有找到合適的窗口,返回空字符串。
    • 如果 len 不為 INT_MAX,意味著找到了最小窗口子串,通過 s.substr(start, len) 獲取該子串并返回。

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

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

相關文章

李宏毅-Self-attention機制詳解

原視頻鏈接&#xff1a;attention 一. 基本問題分析 1. 模型的input 無論是預測視頻觀看人數還是圖像處理&#xff0c;輸入都可以看作是一個向量&#xff0c;輸出是一個數值或類別。然而&#xff0c;若輸入是一系列向量&#xff0c;長度可能會不同&#xff0c;例如把句子里的…

C 深入指針(4)

目錄 一、字符指針變量 1 初始化 2 與字符串數組的區別 二、數組指針變量 1 初始化 2 二維數組傳參本質 三、函數指針變量 1 初始化 2 用法 四、typedef關鍵字 五、函數指針數組 一、字符指針變量 1 初始化 //VS2022 x64 #include <stdio.h> int main() {…

機器人非線性阻抗控制系統

機器人非線性控制系統本質上是一個復雜的控制系統&#xff0c;其狀態變量和輸出變量相對于輸入變量的運動特性不能用線性關系來描述。這種系統的形成基于兩類原因&#xff1a;一是被控系統中包含有不能忽略的非線性因素&#xff0c;二是為提高控制性能或簡化控制系統結構而人為…

人形機器人場景應用全解析,2024睿抗 AI ROBOT創新挑戰賽火熱報名中!

人工智能&#xff08;AI&#xff09;已成為推動科技革命和產業變革的關鍵力量。隨著大模型等AIGC技術的迅猛發展&#xff0c;AI正深刻改變我們的生活并重新定義生產方式。越來越多人期望將AI技術從純粹的思維和計算擴展到與物理世界的互動中&#xff0c;即發展具身智能。 為了推…

探索中國文本到視頻AI模型——Vidu

引言 隨著人工智能技術的不斷進步&#xff0c;我們見證了從文本到視頻內容生成的革命。最近&#xff0c;一個名為Vidu的中國文本到視頻AI模型引起了全球的關注。由清華大學和中國AI初創公司聲書科技聯合開發的Vidu&#xff0c;于2024年4月27日宣布&#xff0c;它聲稱能夠生成高…

測試周期記錄

測試周期是軟件開發生命周期中的一個重要環節&#xff0c;它包括單元測試、集成測試、系統測試和驗收測試等階段。本文將詳細介紹測試周期的各個階段及其重要性&#xff0c;幫助讀者更好地理解測試周期在軟件開發過程中的作用。 一、單元測試 單元測試是測試周期中的第一個階段…

個人工控方面收藏網址記錄(持續更新中)

1、OPC類 OPC Foundation GitHub Downloads - Unified Automation (unified-automation.com) 物聯網IoT協議之OPC UA快速入門教程 | 源碼先生的調試人生 (debugself.com) OPC Servers - OPC UA Migration - 100 Solutions by Matrikon (matrikonopc.com) Prosys OPC UA Simu…

k8s coredns配置

1.coredns可根據集群具體數量修改pod數&#xff0c;官方推薦比例為5/1&#xff0c;即有15臺服務器最好是3個pod。 2.coredns會繼承pod所在主機的dns解析,修改了主機的dns解析之后&#xff0c;coredns有一段時間的緩存&#xff0c;重啟coredns才會在集群內部立刻生效該解析。 …

SpringBoot3集成WebSocket

標簽&#xff1a;WebSocket&#xff0c;Session&#xff0c;Postman。 一、簡介 WebSocket通過一個TCP連接在客戶端和服務器之間建立一個全雙工、雙向的通信通道&#xff0c;使得客戶端和服務器之間的數據交換變得更加簡單&#xff0c;允許服務端主動向客戶端推送數據&#xf…

003_PyCharm的安裝與使用

如果你正在學習PyQt&#xff0c;本系列教程完全可以帶你入門直至入土。 所謂從零開始&#xff0c;就是從軟件安裝、環境配置開始。 不跳過一個細節&#xff0c;不漏掉一行代碼&#xff0c;不省略一個例圖。 IDE 開始學習一個編程語言&#xff0c;我們肯定是首先得安裝好它&…

std::funture和std::promise

#include <iostream> #include <thread> #include <future>void calculateResult(std::promise<int>& promiseObj) {// 模擬耗時計算std::this_thread::sleep_for(std::chrono::seconds(2));// 設置結果到 promise 中promiseObj.set_value(42); }i…

信息系統項目管理師——十大管理過程輸入、工具和技術、輸出(論文篇)二

六、項目風險管理 規劃風險管理 在撰寫關于“規劃風險管理”的論文時&#xff0c;這個過程是項目風險管理的第一步&#xff0c;旨在建立風險管理的框架&#xff0c;為整個項目周期內的風險識別、分析、應對和監控奠定基礎。以下是規劃風險管理過程中可能涉及的輸入、工具和技…

Python學習(五)異常處理

異常概念 異常的捕獲方法 try: f open("D:/abc.txt","r",encoding"UTF-8") except: print("出現異常了&#xff0c;因為文件不存在&#xff0c;我將open的模式&#xff0c;改為w模式去打開") f open("D:/abc.txt&qu…

Python代碼:十、字符串連接

1、題目 小明有兩個最好的朋友&#xff0c;他們的名字分別用input讀入記錄在兩個字符串中&#xff0c;請使用字符串連接&#xff08;&#xff09;幫助牛牛將兩個朋友的名字依次連接在一個字符串中輸出。 2、代碼 import sysstr1 input() str2 input() str3 str1 str2 pr…

從0到1:使用HuggingFace的管線加載Diffusion模型生成第一張圖像!

Hugging Face系列1&#xff1a;詳細剖析Hugging Face網站資源 前言本篇摘要1. Hugging Face Hub三大件1.1 模型1.1.1 模型簡介1.1.2 制作模型卡片1.1.3 模型下載和上傳1.1.4 模型應用 1.2 數據集1.2.1 數據集簡介1.2.2 調用代碼1.2.3 AutoTrain在線微調 1.3 Space應用1.3.1 內容…

理解 Python 中的 `super()` 與 `__init__()` 方法

在 Python 的面向對象編程中&#xff0c;super() 函數和 __init__() 方法是兩個非常重要的概念。它們在類的繼承和初始化過程中扮演著關鍵的角色。本文將深入探討這兩個概念的工作原理&#xff0c;并通過示例代碼來展示它們的使用。 基本原理 __init__() 方法 __init__() 是…

Vue中的全局事件總線:EventBus與$bus的比較詳解與實戰應用

EventBus實例&#xff1a; var EventBus new Vue() 會創建一個名為EventBus的Vue實例&#xff0c;并將其存儲在變量EventBus中。Vue.prototype.$bus new Vue() 則直接在Vue的原型上創建一個新的Vue實例&#xff0c;并將其賦值給$bus屬性。 使用方式&#xff1a; var EventBus…

C# 結合 JavaScript 對 Web 控件進行數據輸入驗證

目錄 關于數據驗證 范例運行環境 驗證設計 JavaScript 方法 設計 實現 調用示例 C# 方法 設計 實現 調用示例 小結 關于數據驗證 在 Web 應用的錄入界面&#xff0c;數據驗證是一項重要的實現功能&#xff0c;數據驗證是指確認 Web 控件輸入或選擇的數據&#xff…

類對象作為類成員

在C中&#xff0c;類對象可以作為另一個類的成員變量。這種設計方式可以用于創建復雜的對象結構&#xff0c;使得一個類的對象能夠包含另一個類的對象。這種嵌套類的組合方式可以增強代碼的可重用性和模塊化。 類對象作為類成員的示例 讓我們通過一個示例來解釋這一概念。假設…

武漢信息系統建設和服務能力評估CS認證咨詢

很多企業在咨詢信息系統建設和服務能力評估的時候喜歡百度搜索&#xff0c;不管是本地咨詢機構還是外地咨詢機構只要價格便宜就找誰&#xff0c;這個在低等級的CS1是可以這么操作的&#xff0c;一旦上升到CS2級別及以上的&#xff0c;我們一般不推薦找外地咨詢機構&#xff0c;…