/*
题目: 在字符串中找出第一个只出现一次的字符,如果输入“abaccdeff”,则输出 b。
*/
# 这里直接列出这道题的两种解法:
方法一: 普通方法
//一般方法
//所谓一般方法就是一遍又一遍的遍历,这种方法比较传统,但是效率不高;
char Once_Num1(const char *str)
{
const char *ptr = str;
int i = 0;
int count = 0;
assert(str);
while(ptr[i])
{
str = ptr;//每走过一个字符,进入下一次循环,str又从头开始;
while(*str)
{
if(ptr[i] == *str)//将每一个字符与字符串的所有字符比较;
count++;//统计字符出现的次数;
str++;
}
if(count == 1)
return ptr[i];//如果有只出现一次的字符出现,就返回;
count = 0;
i++;
}
return '\0';//没有只出现一次的字符就返回‘\0’;
}
int main()
{
char *str = "abaccdeff";
char ret = Once_Num1(str);
if(ret != '\0')
printf("所求字符为:%c\n",ret);
system("pause");
return 0;
}
# 方法2:哈希表,以空间换取时间
//方法 哈希表;
char Once_Num1(const char *str)
{
int arr[256] = {0};
/*
定义一个哈希表;为什么是256, 因为字符的ASCLL表表示256个字符;
我们是以字符的ASCLL值为数组下标,而字符的出现次数为数组内容的;
*/
const char *ptr = str;
assert(str);
while(*str)
{
arr[*str] += 1;//当前字符出现一次,当前字符为下标的数组内容加一;
str++;
}
while(*ptr)
{
if(arr[*ptr] == 1)//查找第一次出现一次的字符,为什么是又是从字符串开始;
return *ptr; //因为哈希表的下标是从小到大的;是有序的,那样查找的话结果不是我们想要的;
ptr++;
}
return '/0';
}
int main()
{
char *str = "abaccdeff";
char ret = Once_Num1(str);
if(ret != '\0')
printf("%c\n",ret);
system("pause");
return 0;
}
@End!