1. 程式人生 > >劍指offer:第一個只出現一次的字元

劍指offer:第一個只出現一次的字元

 題目:字串中找到第一個只出現一次的字元。

           在一個字串中找出第一個只出現一次的字元。如輸入:"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;
}