写一个函数,传入一个字符串,返回字符串中不同字符的个数!!

时间:2022-05-09 20:23:02
函数样式

int fun(char *str)


字符在acs2码范围内(0~127)不在范围内不统计
例如:传入 abcd 返回 4
传入 aabb返回2
传入aabbcc返回3

13 个解决方案

#1


c++可以用map

c的话,直接开辟一个布尔型数组,长度128,对应0~127字符,初始化为false。对输入的字符串进行遍历,将出现的字符对应的数组元素标记为true。在对数组遍历,统计true的个数,不就行了

#2


arr[ str[ i ] ] = 1

#3


int fun(const char *str)
{
    int ct[128]={0};
    int ret =0;
    for(;*str;++str){
        ret +=(*str>=0 &&++ct[*str++]==1);
    }
    return ret;
}

#4


引用 1 楼 ant2012 的回复:
c++可以用map

c的话,直接开辟一个布尔型数组,长度128,对应0~127字符,初始化为false。对输入的字符串进行遍历,将出现的字符对应的数组元素标记为true。在对数组遍历,统计true的个数,不就行了


set 就行了。最后 size 一下。

#5


这是明显的位图算法

#6


一个笨的算法可以考虑,建一个数组arr[]用于存储不同的字符,和int  count 统计不同的个数;然后依次读取字符串str中每个字符在arr[]中遍历查找,如果arr[]中不存在,把该字符存入arr[]中,count+1 直到遍历完str

#7


引用 3 楼 fly_dragon_fly 的回复:
int fun(const char *str)
{
    int ct[128]={0};
    int ret =0;
    for(;*str;++str){
        ret +=(*str>=0 &&++ct[*str++]==1);
    }
    return ret;
}
你写错了
循环体里面的 *str++ 不用++

#8


    int ct[128]={0};
    int ret = 0;
    
    while(*str)
        ret += ct[ *str++ ]++ == 0;
    
    return ret;

#9


引用 1 楼 ant2012 的回复:
c++可以用map

c的话,直接开辟一个布尔型数组,长度128,对应0~127字符,初始化为false。对输入的字符串进行遍历,将出现的字符对应的数组元素标记为true。在对数组遍历,统计true的个数,不就行了

是这样么

int get_strNum(char *str)
{
bool b_num[128];
for(int i = 0; i < 128; i++)
{
b_num[i] = false;
}
int a = 0;
while(*str != '\0')
{
if(*str < 0 || *str > 128)
{
continue;
}
int temp = *str;
b_num[temp] = true;
str++;
}
for(int i = 0; i < 128; i++)
{
if(b_num[i] == true)
{
a++;
}
}
return a;
}

int main()
{
char *str = "AAbbAAaacddcfffccrtttttttttttttttttttttttttttttttttttttttttt";

int a = fun(str);
printf("%d", a);

return 0;
}

#10


引用 1 楼 ant2012 的回复:
c++可以用map

c的话,直接开辟一个布尔型数组,长度128,对应0~127字符,初始化为false。对输入的字符串进行遍历,将出现的字符对应的数组元素标记为true。在对数组遍历,统计true的个数,不就行了


int get_strNum(char *str)
{
bool b_num[128];
for(int i = 0; i < 128; i++)
{
b_num[i] = false;
}
int a = 0;
while(*str != '\0')
{
if(*str < 0 || *str > 128)
{
continue;
}
int temp = *str;
b_num[temp] = true;
str++;
}
for(int i = 0; i < 128; i++)
{
if(b_num[i] == true)
{
a++;
}
}
return a;
}

int main()
{
char *str = "AAbbAAaacddcfffccrtttttttttttttttttttttttttttttttttttttttttt";

int a = get_strNum(str);
printf("%d", a);

return 0;
}

#11


引用 8 楼 lin5161678 的回复:
    int ct[128]={0};
    int ret = 0;
    
    while(*str)
        ret += ct[ *str++ ]++ == 0;
    
    return ret;

看不懂,能分步骤写吗?

#12


引用 10 楼 CKRGD 的回复:
Quote: 引用 1 楼 ant2012 的回复:

c++可以用map

c的话,直接开辟一个布尔型数组,长度128,对应0~127字符,初始化为false。对输入的字符串进行遍历,将出现的字符对应的数组元素标记为true。在对数组遍历,统计true的个数,不就行了


int get_strNum(char *str)
{
bool b_num[128];
for(int i = 0; i < 128; i++)
{
b_num[i] = false;
}
int a = 0;
while(*str != '\0')
{
if(*str < 0 || *str > 128)
{
continue;
}
int temp = *str;
b_num[temp] = true;
str++;
}
for(int i = 0; i < 128; i++)
{
if(b_num[i] == true)
{
a++;
}
}
return a;
}

int main()
{
char *str = "AAbbAAaacddcfffccrtttttttttttttttttttttttttttttttttttttttttt";

int a = get_strNum(str);
printf("%d", a);

return 0;
}


#13


把最终的代码写出来结贴

感谢1楼2楼,他们的方法很对

int get_strNum(char *str)
{
    bool b_num[128];
    for(int i = 0; i < 128; i++)
    {
        b_num[i] = false;
    }
    int a = 0;
    while(*str != '\0')
    {
        if(*str < 0 || *str > 128)
        {
            str++;
            continue;
        }
        int temp = *str;
        b_num[temp] = true;
        str++;
    }
    for(int i = 0; i < 128; i++)
    {
        if(b_num[i] == true)
        {
            a++;
        }
    }
    return a;
}
 
int main()
{
    char *str = "AAbbAAaacddcfffccrtttttttttttttttttttttttttttttttttttttttttt";
 
    int a = get_strNum(str);
    printf("%d", a);
 
    return 0;
}

#1


c++可以用map

c的话,直接开辟一个布尔型数组,长度128,对应0~127字符,初始化为false。对输入的字符串进行遍历,将出现的字符对应的数组元素标记为true。在对数组遍历,统计true的个数,不就行了

#2


arr[ str[ i ] ] = 1

#3


int fun(const char *str)
{
    int ct[128]={0};
    int ret =0;
    for(;*str;++str){
        ret +=(*str>=0 &&++ct[*str++]==1);
    }
    return ret;
}

#4


引用 1 楼 ant2012 的回复:
c++可以用map

c的话,直接开辟一个布尔型数组,长度128,对应0~127字符,初始化为false。对输入的字符串进行遍历,将出现的字符对应的数组元素标记为true。在对数组遍历,统计true的个数,不就行了


set 就行了。最后 size 一下。

#5


这是明显的位图算法

#6


一个笨的算法可以考虑,建一个数组arr[]用于存储不同的字符,和int  count 统计不同的个数;然后依次读取字符串str中每个字符在arr[]中遍历查找,如果arr[]中不存在,把该字符存入arr[]中,count+1 直到遍历完str

#7


引用 3 楼 fly_dragon_fly 的回复:
int fun(const char *str)
{
    int ct[128]={0};
    int ret =0;
    for(;*str;++str){
        ret +=(*str>=0 &&++ct[*str++]==1);
    }
    return ret;
}
你写错了
循环体里面的 *str++ 不用++

#8


    int ct[128]={0};
    int ret = 0;
    
    while(*str)
        ret += ct[ *str++ ]++ == 0;
    
    return ret;

#9


引用 1 楼 ant2012 的回复:
c++可以用map

c的话,直接开辟一个布尔型数组,长度128,对应0~127字符,初始化为false。对输入的字符串进行遍历,将出现的字符对应的数组元素标记为true。在对数组遍历,统计true的个数,不就行了

是这样么

int get_strNum(char *str)
{
bool b_num[128];
for(int i = 0; i < 128; i++)
{
b_num[i] = false;
}
int a = 0;
while(*str != '\0')
{
if(*str < 0 || *str > 128)
{
continue;
}
int temp = *str;
b_num[temp] = true;
str++;
}
for(int i = 0; i < 128; i++)
{
if(b_num[i] == true)
{
a++;
}
}
return a;
}

int main()
{
char *str = "AAbbAAaacddcfffccrtttttttttttttttttttttttttttttttttttttttttt";

int a = fun(str);
printf("%d", a);

return 0;
}

#10


引用 1 楼 ant2012 的回复:
c++可以用map

c的话,直接开辟一个布尔型数组,长度128,对应0~127字符,初始化为false。对输入的字符串进行遍历,将出现的字符对应的数组元素标记为true。在对数组遍历,统计true的个数,不就行了


int get_strNum(char *str)
{
bool b_num[128];
for(int i = 0; i < 128; i++)
{
b_num[i] = false;
}
int a = 0;
while(*str != '\0')
{
if(*str < 0 || *str > 128)
{
continue;
}
int temp = *str;
b_num[temp] = true;
str++;
}
for(int i = 0; i < 128; i++)
{
if(b_num[i] == true)
{
a++;
}
}
return a;
}

int main()
{
char *str = "AAbbAAaacddcfffccrtttttttttttttttttttttttttttttttttttttttttt";

int a = get_strNum(str);
printf("%d", a);

return 0;
}

#11


引用 8 楼 lin5161678 的回复:
    int ct[128]={0};
    int ret = 0;
    
    while(*str)
        ret += ct[ *str++ ]++ == 0;
    
    return ret;

看不懂,能分步骤写吗?

#12


引用 10 楼 CKRGD 的回复:
Quote: 引用 1 楼 ant2012 的回复:

c++可以用map

c的话,直接开辟一个布尔型数组,长度128,对应0~127字符,初始化为false。对输入的字符串进行遍历,将出现的字符对应的数组元素标记为true。在对数组遍历,统计true的个数,不就行了


int get_strNum(char *str)
{
bool b_num[128];
for(int i = 0; i < 128; i++)
{
b_num[i] = false;
}
int a = 0;
while(*str != '\0')
{
if(*str < 0 || *str > 128)
{
continue;
}
int temp = *str;
b_num[temp] = true;
str++;
}
for(int i = 0; i < 128; i++)
{
if(b_num[i] == true)
{
a++;
}
}
return a;
}

int main()
{
char *str = "AAbbAAaacddcfffccrtttttttttttttttttttttttttttttttttttttttttt";

int a = get_strNum(str);
printf("%d", a);

return 0;
}


#13


把最终的代码写出来结贴

感谢1楼2楼,他们的方法很对

int get_strNum(char *str)
{
    bool b_num[128];
    for(int i = 0; i < 128; i++)
    {
        b_num[i] = false;
    }
    int a = 0;
    while(*str != '\0')
    {
        if(*str < 0 || *str > 128)
        {
            str++;
            continue;
        }
        int temp = *str;
        b_num[temp] = true;
        str++;
    }
    for(int i = 0; i < 128; i++)
    {
        if(b_num[i] == true)
        {
            a++;
        }
    }
    return a;
}
 
int main()
{
    char *str = "AAbbAAaacddcfffccrtttttttttttttttttttttttttttttttttttttttttt";
 
    int a = get_strNum(str);
    printf("%d", a);
 
    return 0;
}