这个主要是利用的是哈希表,不明白的是时间复杂度是O(N)
思路1:遍历,也就是从头开始取字符串中的一个字符,将其与其后的所有字符比较,如果有相同的字符,那么就证明它不是只出现一次的字符。当第一次出现遍历完其后字符并且没有重复时,表明这个字符就是“第一个只出现一次的字符”。
思路2:我们可以定义哈希表的键值(Key)是字符的ASCII值,而值(Value)是该字符出现的次数。同时我们需要扫描两次字符串,第一次扫描字符串时,每扫描到一个字符就在哈希表的对应项中把次数加1。接下来第二次扫描的时候,没扫描到一个字符就能在哈希表中得到该字符出现的次数。找出第一个Value为1的那个key就是我们需要找到那个字符。
#include<stdio.h>
#include<error.h>
#include<string.h>
#define ERROR -22
#define BUFFER_SIZE 256
static int FirstNoRepeat(char *str)
{
if(str==NULL){
fprintf(stderr, "%s:str should not be NULL\n", __func__);
return ERROR;
}
char buffer[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);
char *ptr = str;
while(*ptr){
buffer[*ptr]++;
ptr++;
}
ptr = str;
while(*ptr){
if(buffer[*ptr]==1){
return *ptr;
}
ptr++;
}
return 0;
}
int main()
{
char arr1[] = "1bbafg";
printf("%c\n", FirstNoRepeat(arr1));
char arr2[] = "6786789";
printf("%c\n", FirstNoRepeat(arr2));
}