c++代码问题 求大神指导

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

#include
#include
using namespace std;
int main()
{
string str;
cin >> str;
int j=0,p;
for (int i =0; i <= str.size() - 1; i++)
{

 if(str[i]>=0&&str[i]<=127)
    {
        for(int k =0; k<i; k++)
        {
            p=0;
            if(str[k]==str[i])
                p=1;
        }
        if(p!=1)
            j++;

    }
}
cout<<j;
return 0;

}

我的代码自己测试的时候么问题 但是提交的时候系统给的测试字符串答案就不对 请问是怎么会事呢??

测试用例:
uqic^g`(s&jnl(m#vt!onwdj(ru+os&wx

对应输出应该为:

24

你的输出为:

33

谢谢!币不多 不要嫌弃!

12个回答

原程序将此处:
for(int k =0; k<i; k++)
{
p=0;
if(str[k]==str[i])
p=1;
}

改为:
for(int k =0; k<i; k++)
{
p=0;
if(str[k]==str[i]){
p=1;
break;
}
}

你这逻辑有问题,
for(int k =0; k<i; k++)
{
p=0;
if(str[k]==str[i])
p=1;
}
if(p!=1)
j++;
即使执行了
if(str[k]==str[i])
p=1;
接下来的循环中也会执行 p=0;

建议直接开一个大小为128的数组,初始化为0,然后将出现过的字母的ACSII码下标标记为1, 然后将数组累加起来。
比如 出现 ABC
则数组下标为65,66,67的值为1,累加起来就是3。

把for循环改一下,结束条件不对

 for (int i =0; i <= str.size() - 1; i++)
{

    if(str[i]>=0&&str[i]<=127)
    {
        for(int k =0; k<i; k++)
        {
            if(str[k]==str[i])
                break;
        }
    }
}
 #include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
    string str;
    cin >> str;
    int j=0,p;
    for (int i =0; i <= str.size() - 1; i++)
    {
        p = 0;
         if(str[i]>=0&&str[i]<=127)
         {
             for(int k =0; k<i; k++)
             {
                 if(str[k]==str[i])
                 {
                     p=1;
                     break;
                 }
             }


         }
        if(p!=1)
                 j++;
    }
    cout<<j;
    return 0;
}
seeze
Zedee 写错了
3 年多之前 回复

上面的有错

 #include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
    string str;
    cin >> str;
    int j=0,p;
    for (int i =0; i <= str.size() - 1; i++)
    {

         if(str[i]>=0&&str[i]<=127)
         {
             p = 0;
             for(int k =0; k<i; k++)
             {
                 if(str[k]==str[i])
                 {
                     p=1;
                     break;
                 }
             }
             if(p!=1)
                 j++;

         }

    }
    cout<<j;
    return 0;
}

//这个时间复杂度为o(n)。 很不错的方法。

#include
#include
using namespace std;
int main()
{
string str;
cin>>str;
char table[128]={0};
int j=0;
for (int i =0; i <= str.size() - 1; i++)
{
if(table[str[i]] == 0)
table[str[i]] = 1;
else
j++;//重复的字符

}
cout<<str.size()-j;
return 0;

}


 for(int k =0; k<i; k++)
        {
            p=0;
            if(str[k]==str[i])
                p=1;
        }

这段代码在p=1;后加上break;语句,查找到重复的跳出循环;你原来的代码中未跳出循环,结果p可能最终又变为了0.

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

设计意图没明确,写代码就不明确,因分析不明确缘故.
假设字符串uqic^g(s&jnl(m#vt!onwdj(ru+os&wx
取一字符,先要判断是否在ACSII码范围内,次用递减判断是否已记(即重复).
分析明白后再写代码就清楚了.*/
string 字符串= "uqic^g
(s&jnl(m#vt!onwdj(ru+os&wx";
int 计数 = 0, 循环 = 0, 比较 = 0, 判断 = 1;
do
{
if (字符串[循环] >= 0 && 字符串[循环] <= 127)
while (循环 > 比较 && 比较 >= 0)
if (字符串[循环] == 字符串[比较--])
{
判断 = 0;
break;
}
if(判断)
++计数;
比较 = ++循环 - 1;
判断 = 1;
} while (循环 < 字符串.size());
std::cout << 计数 << std::endl;

int main(){
    string str,temp="";
    cin>> str;
    for (int i=0; i<str.size(); i++) {
        if(str[i]>=0&&str[i]<=127){
            if (!contains(temp, str[i])) {
                temp+=str[i];
            }
        }
    }
    cout<<temp.size();
    return 0;
}

bool contains(string str,char c){
    bool b=false;
    for (int i=0;i<str.size();i++) {
        b|=str[i]==c;
    }
    return b;
}


int main(){
    string str,temp="";
    cin>> str;
    for (int i=0; i<str.size(); i++) {
        if(str[i]>=0&&str[i]<=127){
            if (!contains(temp, str[i])) {
                temp+=str[i];
            }
        }
    }
    cout<<temp.size();
    return 0;
}

bool contains(string str,char c){
    bool b=false;
    for (int i=0;i<str.size();i++) {
        b|=str[i]==c;
    }
    return b;
}


共12条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问