1. 程式人生 > 其它 >監控多資料夾目錄變化,python,win32

監控多資料夾目錄變化,python,win32

方法一:使用雜湊表儲存頻數

我們可以對字串進行兩次遍歷。

在第一次遍歷時,我們使用雜湊對映統計出字串中每個字元出現的次數。在第二次遍歷時,我們只要遍歷到了一個只出現一次的字元,那麼就返回該字元,否則在遍歷結束後返回空格。

class Solution {
public:
    char firstUniqChar(string s) {
        unordered_map<char, int> mp;
        for (char c : s)
            mp[c]++;
        
        char res = ' ';
        for (char c : s) {
            if (mp[c] == 1) {
                res = c;
                break;
            }
        }
        return res;
    }
};

方法二:使用雜湊表儲存索引

我們可以對方法一進行修改,使得第二次遍歷的物件從字串變為雜湊對映。

具體地,對於雜湊對映中的每一個鍵值對,鍵表示一個字元,值表示它的首次出現的索引(如果該字元只出現一次)或者 −1(如果該字元出現多次)。當我們第一次遍歷字串時,設當前遍歷到的字元為 c,如果 c 不在雜湊對映中,我們就將 c 與它的索引作為一個鍵值對加入雜湊對映中,否則我們將 c 在雜湊對映中對應的值修改為 −1。

在第一次遍歷結束後,我們只需要再遍歷一次雜湊對映中的所有值,找出其中不為 −1 的最小值,即為第一個不重複字元的索引,然後返回該索引對應的字元。如果雜湊對映中的所有值均為 −1,我們就返回空格。

class Solution {
public:
    char firstUniqChar(string s) {
        int n = s.size();
        unordered_map<char, int> mp;
        for (int i = 0; i < n; i++)
            if (mp.count(s[i]))
                mp[s[i]] = -1;
            else 
                mp[s[i]] = i;
        
        int minIndex = n;
        for (auto [c, index] : mp)
            if (index != -1 && index < minIndex)
                minIndex = index;
        
        return minIndex == n ? ' ' : s[minIndex];
    }
};

方法三:佇列

我們也可以藉助佇列找到第一個不重複的字元。佇列具有「先進先出」的性質,因此很適合用來找出第一個滿足某個條件的元素

具體地,我們使用與方法二相同的雜湊對映,並且使用一個額外的佇列,按照順序儲存每一個字元以及它們第一次出現的位置。當我們對字串進行遍歷時,設當前遍歷到的字元為 c,如果 c 不在雜湊對映中,我們就將 c 與它的索引作為一個二元組放入隊尾,否則我們就需要檢查佇列中的元素是否都滿足「只出現一次」的要求,即我們不斷地根據雜湊對映中儲存的值(是否為 −1)選擇彈出隊首的元素,直到隊首元素「真的」只出現了一次或者佇列為空。

在遍歷完成後,如果佇列為空,說明沒有不重複的字元,返回空格,否則隊首的元素即為第一個不重複的字元以及其索引的二元組。

在維護佇列時,我們使用了「延遲刪除」這一技巧。也就是說,即使佇列中有一些字元出現了超過一次,但它只要不位於隊首,那麼就不會對答案造成影響,我們也就可以不用去刪除它。只有當它前面的所有字元被移出佇列,它成為隊首時,我們才需要將它移除。

class Solution {
public:
    char firstUniqChar(string s) {
        int n = s.size();
        unordered_map<char, int> mp;
        queue<char> q;
        
        for (int i = 0; i < n; i++) {
            if (mp.count(s[i])) {
                mp[s[i]] = -1;
                while (q.size() && mp[q.front()] == -1)
                    q.pop();
            } else {
                mp[s[i]] = i;
                q.push(s[i]);
            }
        }
        
        return q.size() ? q.front() : ' ';
    }
};