程序員面試題精選100題(13)-第一個只出現一次的字符

題目:在一個字符串中找到第一個只出現一次的字符。如輸入abaccdeff,則輸出b
分析:這道題是2006google的一道筆試題。
看到這道題時,最直觀的想法是從頭開始掃描這個字符串中的每個字符。當訪問到某字符時拿這個字符和後面的每個字符相比較,如果在後面沒有發現重複的字符,則該字符就是隻出現一次的字符。如果字符串有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
//這個地方我想錯了,不是遍歷hash表,而是繼續遍歷字符串,這不就可以知道字符出現的先後順序了。
      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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章