面試題35 第乙個只出現一次的字元

2021-09-06 06:16:43 字數 1780 閱讀 5405

題目:在字串中找出第乙個只出現一次的字元。如輸入「abaccdeff」,則輸出『b』。
看到這個題目,最直觀的想法就是就是遍曆法,也就是從頭開始取字串中的乙個字元,將其與其後的所有字元比較,如果有相同的字元,那麼就證明它不是只出現一次的字元。當第一次出現遍歷完其後字元並且沒有重複時,表明這個字元就是「第乙個只出現一次的字元」。如果字串有n個字元,每個字元可能與後面的o(n)個字元相比較,因此這種思路的時間複雜度是o(n2)。

題目中要求第乙個只出現一次的字元,那麼就跟字元出現的次數有關。我們考慮如何統計字元出現的次數,然後找出第乙個次數為1的那個字元。這裡我們需要乙個資料容器來儲存字元出現次數,並且能夠通過字元找出其相對應的次數。雜湊表就是一種常用用的容器。

我們可以定義雜湊表的鍵值(key)是字元的ascii值,而值(value)是該字元出現的次數。同時我們需要掃瞄兩次字串,第一次掃瞄字串時,每掃瞄到乙個字元就在雜湊表的對應項中把次數加1。接下來第二次掃瞄的時候,沒掃瞄到乙個字元就能在雜湊表中得到該字元出現的次數。找出第乙個value為1的那個key就是我們需要找到那個字元。

#include#include

using

namespace

std;

//o(n^n)的時間複雜度

char firstnotrepeatingchar2(char *pstring)

}if(flag==0

)

return

pstring[i];

}return'\0

';}//

o(n)的時間複雜度

char firstnotrepeatingchar(char *pstring)

char *phashkey=pstring;

//第一遍遍歷字串,求出每個字元出現的次數

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

)

phashkey=pstring;

//第二遍遍歷字串,求出第乙個只出現一次的字元,每次都是按照字串的順序遍歷

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

)

return'\0

';}void

main()

字元(char)是乙個長度為8bit的資料型別,因此總共最多能夠表示256種字元。所以在前面的**示例中我們直接建立了乙個長度為256的整型陣列,每個字元根據其ascii值作為陣列的下標對應陣列的乙個數字,而陣列中儲存的是每個字元出現的次數。這樣我們就建立了乙個大小為256,以字元ascii嗎為鍵值的雜湊表。

但是假如我們的字串長度小於256,那麼我們可以通過建立乙個字串長度的整型陣列來存放鍵值,鍵值是ascii%len。**實現如下:

char firstnotrepeatingchar3(char *pstring)

char *phashkey=pstring;

//第一遍遍歷字串,求出每個字元出現的次數

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

)

phashkey=pstring;

//第二遍遍歷字串,求出第乙個只出現一次的字元,每次都是按照字串的順序遍歷

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

)

return'\0';}

上述思想錯誤,因為ascii%len結果相等,但是ascii可能不相等。比如字串為「abacdeffk」,那麼第乙個只出現一次的字元不是b,而是c。這是因為b跟k對len求hash值結果相同。

面試題35 第乙個只出現一次的字元

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

面試題35 第乙個只出現一次的字元

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

劍指offer 面試題35 第乙個只出現一次的字元

題目 在字串中找出第乙個只出現一次的字元。如輸入 abaccdeff 則輸出 b 思路 這道題目不難,遍歷一遍統計每個字元出現的次數就完了。作者用的是雜湊表,因為只需要統計次數,而且字元只有256中,可以用乙個大小為256的陣列實現。自己用stl裡的multimap容器也實現了,道理完全一樣。雜湊表...