題目:在乙個字串中找到第乙個只出現一次的字元。如輸入abaccdeff,則輸出b。
我的思路是:
如果要知道乙個字元是否只出現過一次,必須遍歷一次字串知道所有字元出現過的情況,從前從後都可以。但在遍歷中要用陣列統計每個字元的出現次數,到最後將,再遍歷一遍陣列,得到出現次數為1的第乙個字元,取出。
空間複雜度:o(1)
時間複雜度:o(n)
這是別人通過hashtable來完成的,殊途同歸!
ref:
看到這道題時,最直觀的想法是從頭開始掃瞄這個字串中的每個字元。當訪問到某字元時拿這個字元和後面的每個字元相比較,如果在後面沒有發現重複的字元,則該字元就是只出現一次的字元。如果字串有n個字元,每個字元可能與後面的o(n)個字元相比較,因此這種思路時間複雜度是o(n2)。我們試著去找乙個更快的方法。
由於題目與字元出現的次數相關,我們是不是可以統計每個字元在該字串中出現的次數?要達到這個目的,我們需要 乙個資料容器來存放每個字元的出現次數。在這個資料容器中可以根據字元來查詢它出現的次數,也就是說這個容器的作用是把乙個字元對映成乙個數字。在常用的 資料容器中,雜湊表正是這個用途。
雜湊表是一種比較複雜的資料結構。由於比較複雜,stl中沒有實現雜湊表,因此需要我們自己實現乙個。但由於本題的特殊性,我們只需要乙個非常簡單的雜湊表就能滿足要求。由於字元(char)是乙個長度為8的資料型別,因此總共有可能256 種可能。於是我們建立乙個長度為256的陣列,每個字母根據其ascii碼值作為陣列的下標對應陣列的對應項,而陣列中儲存的是每個字元對應的次數。這樣我們就建立了乙個大小為256,以字元ascii碼為鍵值的雜湊表。(並不僅限於英文本元,所以這裡要考慮256種可能)。
我們第一遍掃瞄這個陣列時,每碰到乙個字元,在雜湊表中找到對應的項並把出現的次數增加一次。這樣在進行第二次掃瞄時,就能直接從雜湊表中得到每個字元出現的次數了。
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
char firstnotrepeatingchar(char* pstring)
//如果這個字串為空,或者字串中的每個字元都至少出現兩次
return 0;
}int main(void)
也可以通過原理相同的點陣圖的形式來完成,很巧妙!
int main()
; int i=0;
int j=0;
for(;i=j)
printf("no ele to the rule\n");
return 0;
}
不管是通過雜湊表還是位圖實現,都是o(n)的時間複雜度跟o(1)的空間複雜度。
在乙個字串中找到第乙個只出現一次的字元
在乙個字串中找到第乙個只出現一次的字元 題目 在乙個字串中找到第乙個只出現一次的字元。如輸入abaccdeff,則輸出b。我的思路是 如果要知道乙個字元是否只出現過一次,必須遍歷一次字串 知道所有字元出現過的情況,從前從後都可以。但在遍歷中要用陣列統計每個字元的出現次數,到最後將,再遍歷一遍陣列,得...
在乙個字串中找到第乙個只出現一次的字元
題目 在乙個字串中找到第乙個只出現一次的字元。如輸入abaccdeff,則輸出b。看到這道題時,最直觀的想法是從頭開始掃瞄這個字串中的每個字元。當訪問到某字元時拿這個字元和後面的每個字元相比較,如果在後面沒有發現重複的字元,則該字元就是只出現一次的字元。如果字串有n個字元,每個字元可能與後面的o n...
在乙個字串中找到第乙個只出現一次的字元。
題目描述 在乙個字串中找到第乙個只出現一次的字元。如輸入 abaccdeff,則輸出 b。思路 用hash表來儲存相應的字元,key為ch a value為相應的出現的次數,遍歷字串,尋找對應的hash表中value為1所對應的字元 如下 如有您有任何疑問及發現問題,歡迎隨時指正 include i...