程式員面試題精選(13):第一個只出現一次的字元

來源:互聯網
上載者:User
題目:在一個字串中找到第一個只出現一次的字元。如輸入abaccdeff,則輸出b。

分析:這道題是2006年google的一道筆試題。

看到這道題時,最直觀的想法是從頭開始掃描這個字串中的每個字元。當訪問到某字元時拿這個字元和後面的每個字元相比較,如果在後面沒有發現重複的字元,則該字元就是只出現一次的字元。如果字串有n個字元,每個字元可能與後面的O(n)個字元相比較,因此這種思路時間複雜度是O(n2)。我們試著去找一個更快的方法。

由於題目與字元出現的次數相關,我們是不是可以統計每個字元在該字串中出現的次數?要達到這個目的,我們需要一個資料容器來存放每個字元的出現次數。在這個資料容器中可以根據字元來尋找它出現的次數,也就是說這個容器的作用是把一個字元對應表成一個數字。在常用的資料容器中,雜湊表正是這個用途。

雜湊表是一種比較複雜的資料結構。由於比較複雜,STL中沒有實現雜湊表,因此需要我們自己實現一個。但由於本題的特殊性,我們只需要一個非常簡單的雜湊表就能滿足要求。由於字元(char)是一個長度為8的資料類型,因此總共有可能256 種可能。於是我們建立一個長度為256的數組,每個字母根據其ASCII碼值作為數組的下標對應數組的對應項,而數組中儲存的是每個字元對應的次數。這樣我們就建立了一個大小為256,以字元ASCII碼為索引值的雜湊表。

我們第一遍掃描這個數組時,每碰到一個字元,在雜湊表中找到對應的項並把出現的次數增加一次。這樣在進行第二次掃描時,就能直接從雜湊表中得到每個字元出現的次數了。

參考代碼如下:

///////////////////////////////////////////////////////////////////////
// Find the first char which appears only once in a string
// Input: pString - the string
// Output: the first not repeating char if the string has, otherwise 0
///////////////////////////////////////////////////////////////////////
char FirstNotRepeatingChar(char* pString)
{
      // invalid input
      if(!pString)
            return 0;

      // get a hash table, and initialize it 
      const int tableSize = 256;
      unsigned int hashTable[tableSize];
      for(unsigned int i = 0; i < tableSize; ++ i)
            hashTable[i] = 0;

      // get the how many times each char appears in the string
      char* pHashKey = pString;
      while(*(pHashKey) != '/0')
            hashTable[*(pHashKey++)] ++;

      // find the first char which appears only once in a string
      pHashKey = pString;
      while(*pHashKey != '/0')
      {
            if(hashTable[*pHashKey] == 1)
                  return *pHashKey;

            pHashKey++;
      }

      // if the string is empty 
      // or every char in the string appears at least twice
      return 0;

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.