這是《劍指offer》中的一道關於字符串的面試題:

對於一個普通人來說,拿到這個題最先想到的方法估計就是遍歷整個字符串,用訪問到得字符和其他字符進行比較,咦,如果遇到一個沒有和他一樣的其他字符,那么我們就返回這個字符。但是這種方法的時間復雜度是o(n2),雖然我們能夠想到這樣的方法,但我們自己估計都會覺得這種方法low。
劍指offer上面給我們提供了一種比較巧妙的方法,就是我們可以找一個數據的容器,在對應的地方存儲某一個字符的出現次數,然后在遍歷一次這個容器,遇到存儲值為1的時候就返回這個位置所代表的字符。這樣的方法可能聰明的人會往這樣的方向想,但是要想用一個對應的位置代表一個字符可能覺得很有難度。劍指offer告訴我們可以用一個很簡單的哈希表就能實現,簡單地說就是我們可以新建一個數組,因為一個字符長度為8,總共有256種可能,那么我們所創建的數組大小就是256.每一個字符的ASCII碼值作為數組下標都對應某一個值,所對應的值就是之后我們遍歷原字符串存儲進去的這個字符的出現次數,然后在遍歷一次字符串,同時看這個字符在剛才的那個數組中對應位置所存的值,也就是它的出現次數是不是1,如果是1的話就將此值返回為我們要尋找的第一個出現一次的字符。 大功告成。
詳細講解大家可以再去翻翻劍指offer。
1 #include <stdio.h> 2 #include<windows.h> 3 4 #define size 256 5 char Findchar(char* pstr) 6 { 7 int hashtable[size] = {0}; 8 char *phashkey = pstr; 9 if (pstr == NULL) 10 { 11 return '\0'; 12 } 13 14 while (*phashkey != '\0') 15 { 16 hashtable[*phashkey]++; 17 phashkey++; 18 } 19 phashkey = pstr; 20 while (*phashkey != '\0') 21 { 22 if (hashtable[*phashkey] == 1) 23 { 24 return *phashkey; 25 } 26 phashkey++; 27 } 28 return '\0'; 29 } 30 int main() 31 { 32 char *str = "zccadd"; 33 char ch = Findchar(str); 34 printf("%c", ch); 35 36 system("pause"); 37 return 0; 38 }
