题目描述
编写一个函数,计算字符串中含有的不同字符的个数。字符在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)较好。