在乙個字串中找到第乙個只出現一次的字元

2021-06-29 11:17:20 字數 1090 閱讀 4009

題目:在乙個字串中找到第乙個只出現一次的字元。如輸入a1bacc1#¥2d7eff,則輸出b。 

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

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

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

雜湊表是一種比較複雜的資料結構。由於比較複雜,stl中沒有實現雜湊表,因此需要我們自己實現乙個。但由於本題的特殊性,我們只需要乙個非常簡單的雜湊表就能滿足要求。由於字元(char)是乙個長度為8的資料型別,因此總共有可能256 種可能。於是我們建立乙個長度為256的陣列,每個字母根據其ascii碼值作為陣列的下標對應陣列的對應項,而陣列中儲存的是每個字元對應的次數。這樣我們就建立了乙個大小為256,以字元ascii碼為鍵值的雜湊表。(並不僅限於英文本元,所以這裡要考慮256種可能)。

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

參考**如下:

1

#include

"stdio.h"2

#include

"string.h"3

#include

"stdlib.h"4

5char

firstnotrepeatingchar(

char

*pstring)630

31//

如果這個字串為空,或者字串中的每個字元都至少出現兩次

32return0;

33}3435

intmain(

void)36

在乙個字串中找到第乙個只出現一次的字元

在乙個字串中找到第乙個只出現一次的字元 題目 在乙個字串中找到第乙個只出現一次的字元。如輸入abaccdeff,則輸出b。我的思路是 如果要知道乙個字元是否只出現過一次,必須遍歷一次字串 知道所有字元出現過的情況,從前從後都可以。但在遍歷中要用陣列統計每個字元的出現次數,到最後將,再遍歷一遍陣列,得...

在乙個字串中找到第乙個只出現一次的字元

題目 在乙個字串中找到第乙個只出現一次的字元。如輸入abaccdeff,則輸出b。我的思路是 如果要知道乙個字元是否只出現過一次,必須遍歷一次字串知道所有字元出現過的情況,從前從後都可以。但在遍歷中要用陣列統計每個字元的出現次數,到最後將,再遍歷一遍陣列,得到出現次數為1的第乙個字元,取出。空間複雜...

在乙個字串中找到第乙個只出現一次的字元

題目 在乙個字串中找到第乙個只出現一次的字元。如輸入abaccdeff,則輸出b。看到這道題時,最直觀的想法是從頭開始掃瞄這個字串中的每個字元。當訪問到某字元時拿這個字元和後面的每個字元相比較,如果在後面沒有發現重複的字元,則該字元就是只出現一次的字元。如果字串有n個字元,每個字元可能與後面的o n...