牛客网-华为在线编程-010-字符个数统计

来源:互联网 发布:8月美国非农数据预测 编辑:程序博客网 时间:2024/05/20 15:36

题目描述

编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127)。不在范围内的不作统计。

输入描述:

输入N个字符,字符在ACSII码范围内。

输出描述:

输出范围在(0~127)字符的个数。

示例1

输入

abc

输出

3
解题思路一:利用点击打开链接中的字符串去重方法,输出去重后的size。

#include <iostream>#include <string>using namespace std;int main(){    string s;    int i = 0;    cin>>s;    int n = 0;    n = s.size();    string str(s,n-1);    for(i=n-1;i>=0;i--)    {        if(str.find(s[i]) == -1)        {            str = str+s[i];        }    }    cout<<str.size()<<endl;}
解题思路二:遍历ASCII码(0~127),对比每个ASCII码是否存在于字符串中,如果存在,则计数count++。
#include <iostream>#include <string>using namespace std; int main()    {    string b;    getline(cin,b);    int count=0;    for(int i=0;i<=127;i++)        if(b.find(i)!=string::npos)        count++;    cout<<count;}
说明:1)这里是遍历ASCII,不是字符串。2)b.find(i),其中i是ASSCII码,指向一个对应的字符。3)注意string.find() 搜索不到时的返回npos,这里没有使用-1而是使用的string::npos,更为严谨。
解题思路三:同样是打标签的方法,利用数组下标给每个输入的字符打标签,然后遍历ASCII码(0~127)进行对比计数。

#include <iostream>using namespace std; int main(){    char ch;    int arr[128]={0};    int count=0;    while(cin>>ch){        if(ch>=0 && ch<=127){            arr[ch]++;        }    }    for(int i=0;i<128;i++){        if(arr[i]>0)            count++;    }    cout<<count<<endl;    return 0;}
说明:1)char ch;while(cin>>ch),是每一次提取一个输入字符;string str;while(cin>>str),这里是读入字符串,注意”空格是cin的分隔符“,所以输入的字符串遇到空格就不继续存入str,空格后再次输入将会更新覆盖str的值,见点击打开链接中的相关讨论;而getline(cin,str)是读取一整行字符串,不受空格影响。2)if(ch>=0 && ch<=127)是拿ch的ASCII码与(0~127)作比较。3)arr[ch]也是以字符的ASCII码作为数组的下标。
解题思路四:类似方法一。

链接:https://www.nowcoder.com/questionTerminal/eb94f6a5b2ba49c6ac72d40b5ce95f50来源:牛客网/*C++输入字符,ascii值在[0,127]时插入集合set中,输出set中的元素个数。*/#include<iostream>#include<set>using namespace std;int main(){    char c;    set<char> s;    while(cin>>c){        if(c>=0 && c<=127){            s.insert(c);        }    }    cout << s.size() <<endl;}

注意:本题中用while(cin>>ch)实际上不是完全正确的,牛客网的测试用例存在bug,没有考虑空格的情况,严格来讲空格(space)属于ASCII码(0~127),ASCII码为032,所以使用getline(cin>>str)较好。






原创粉丝点击