对于这个问题,常规思路我们进行分析,你首先肯定是喜欢先让指向一个字符,然后和它后面的每个字符进行比较,如果后面没有相同的字符的话,这个字符就是你所要找的第一个只出现一次的字符。
但是这种思路我们首先要比较n个字符,然后每个字符可能要与后面有n个字符比较,所以,最后我们可以知道这个的时间复杂度为O(n^2),作为一个精益求精的程序员,我想我们肯定要对此进行优化。
对于这个字符串,我们面对这里面所有的字符,我们只需要通过求出每一个单个字符出现的次数,然后通过这个次数来判定。在这我们可以采用数组来存放这些次数,当然,因为是字符串,所以每一个字符取值最多也就是256。
其实这种把一个字符映射成一个数字的数据容器,就是我们所说的哈希表
所以我们了解了原理,就可以在纸上写出我们的程序了。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define MAX_SIZE 256
char check_one_arr(const char *str)
{
assert(str);
unsigned int hash[MAX_SIZE] = { 0 };
const char *p = str;
while (*p!= '\0' )
{
hash[*p++]++;//在这所做的就是对每个字符所对应的哈希表元素进行次数统计
}
p = str;
while (*p !='\0')
{
if (hash[*p] == 1)//这里进行判定第一个只出现一次的字符
return *p;
p++;
}
return *str;
}
int main()
{
char *arr = "aabbcchddee";
char ret=check_one_arr(arr);
printf("%c", ret);
system("pause");
return 0;
}
在这里面,第一次扫描的时候,对数组,哈希表更新n个字符为O(n),然后第二次扫面的时候,采用O(1)能够都出一个字符出现的次数,所以这样时间复杂度会减小很多。