第乙個只出現一次的字元

2021-06-17 16:17:25 字數 1566 閱讀 4275

題目:在乙個字串中找到第乙個只出現一次的字元。如輸入 abaccdeff,則輸

出b。 分析:這道題是 2023年google的一道筆試題。 

看到這道題時,最直觀的想法是從頭開始掃瞄這個字串中的每個字元。當訪問

到某字元時拿這個字元和後面的每個字元相比較,如果在後面沒有發現重複的字

符,則該字元就是只出現一次的字元。如果字串有 n個字元,每個字元可能與

後面的o(n)個字元相比較,因此這種思路時間複雜度是 o(n2)。我們試著去找一

個更快的方法。 

由於題目與字元出現的次數相關,我們是不是可以統計每個字元在該字串中出

現的次數?要達到這個目的,我們需要乙個資料容器來存放每個字元的出現次

數。在這個資料容器中可以根據字元來查詢它出現的次數,也就是說這個容器的

作用是把乙個字元對映成乙個數字。在常用的資料容器中,雜湊表正是這個用途。  

雜湊表是一種比較複雜的資料結構。由於比較複雜,stl 中沒有實現雜湊表,因

此需要我們自己實現乙個。但由於本題的特殊性,我們只需要乙個非常簡單的哈

希表就能滿足要求。由於字元(char)是乙個長度為8的資料型別,因此總共有

可能256 種可能。於是我們建立乙個長度為 256的陣列,每個字母根據其 ascii

碼值作為陣列的下標對應陣列的對應項,而陣列中儲存的是每個字元對應的次

數。這樣我們就建立了乙個大小為 256,以字元ascii碼為鍵值的雜湊表。 

我們第一遍掃瞄這個陣列時,每碰到乙個字元,在雜湊表中找到對應的項並把出

現的次數增加一次。這樣在進行第二次掃瞄時,就能直接從雜湊表中得到每個字

符出現的次數了。 

// 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 = 0; 

char* phashkey = pstring; 

while(*(phashkey) != '/0') 

hashtable[*(phashkey++)] ++; 

phashkey = pstring; 

while(*phashkey != '/0') 

if(hashtable[*phashkey] == 1) 

return *phashkey; 

phashkey++; 

// if the string is empty  

return 0; 

第乙個只出現一次的字元

題目 在乙個字串中找到第乙個只出現一次的字元,並輸出它在字串中的位置。如輸入 abaccdeff,則輸出 b 1。定義乙個256長度的陣列,乙個用來記錄字元出現的次數。然後在遍歷字元陣列,如果該字元出現了一次,輸出並結束,否則繼續。include using namespace std 在乙個字串中...

第乙個只出現一次的字元

1.問題描述 在字串中找出第乙個只出現一次的字元。例如輸入abaccdeff,則輸出 b。來自 劍指offer 2.分析 我們可以用乙個容器來存放 對應的字元和出現次數 雜湊表 這裡僅僅用陣列來簡單的模擬了一下 第一次掃瞄時將出現的次數存放在表中,第二次掃瞄時掃瞄到次數為1的字元並返回該字元即可。表...

第乙個只出現一次的字元

題目 在字串中找出第乙個只出現一次的字元。如輸入 abaccdeff 則輸出 b 看到這個題目,最直觀的想法就是就是遍曆法,也就是從頭開始取字串中的乙個字元,將其與其後的所有字元比較,如果有相同的字元,那麼就證明它不是只出現一次的字元。當第一次出現遍歷完其後字元並且沒有重複時,表明這個字元就是 第乙...