劍指offer:第一個只出現一次的字元
阿新 • • 發佈:2018-12-31
題目:字串中找到第一個只出現一次的字元。
在一個字串中找出第一個只出現一次的字元。如輸入:"abaccdeff",則輸出: b
思路:
(1) 時間複雜度是 O(n^2)
從頭開始掃描這個字串中的每個字元。當訪問到某字元時拿這個字元和後面的每個字元相比較,如果在後面沒有發現重複的字元,則該字元就是隻出現一次的字元。如果字串有n個字元,每個字元 可能與後面的O(n)個字元相比較。
(2) 時間複雜度是 O(n)
因為與字元出現的次數有關,所以可以統計每個字元在該字串中出現的次數,需要一個數據容器存放每個字元的出現數 ,即這個容器的作用是:把一個字元對映成一個數字。由於字元(char)是一個長度為8的資料型別(1位元組=8bit位),因此總共有2^8=256 種可能。 每個字母根據其ASCII碼值作為陣列的下標對應陣列的一個數字,陣列中儲存的是每個字元出現的次數。
程式碼:
#include<stdio.h> char FirstNotRepeatingChar(char* pString)//第一個只出現一次的字元 { if (pString == NULL) { return NULL; } const int tableSize = 256; unsigned int hashTable[tableSize]; for (unsigned int i = 0; i < tableSize; i++)//建立了一個大小為256,以字元ASCII碼為鍵值的雜湊表 { hashTable[i] = { 0 }; } char* pHashKey = pString;//使指標指向第一個字元 while (*(pHashKey) != '\0') { hashTable[*(pHashKey++)]++;//後置++,該句執行完後,指標向後++,該陣列所儲存的字元出現的次數++ } pHashKey = pString;//再次遍歷,查詢返回值為1的字元,即只出現一次並且是第一次出現的 while (*(pHashKey)!= '\0') { if (hashTable[*(pHashKey)] == 1) { return *pHashKey;//解引用,即是所指的字元 } pHashKey++; } return NULL; } int main() { char str[] = "abaccdeff"; char rt = FirstNotRepeatingChar(str); printf("abaccdeff 中第一次出現的字元:%c\n", rt); return 0; }