这是《剑指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 }