Marconi25
2016-11-10 03:03
采纳率: 83.3%
浏览 1.5k
已采纳

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条回答 默认 最新

  • chomol 2016-11-10 03:33
    已采纳

    原程序将此处:
    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;
    }
    }

    点赞 打赏 评论
  • AlbertS 2016-11-10 03:19

    把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;
            }
        }
    }
    
    点赞 打赏 评论
  • chomol 2016-11-10 03:21

    你这逻辑有问题,
    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。

    点赞 打赏 评论
  • Zedee 2016-11-10 03:42
     #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;
    }
    
    点赞 打赏 评论
  • Zedee 2016-11-10 03:45

    上面的有错

     #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;
    }
    
    点赞 打赏 评论
  • 小小小小小学生 2016-11-10 05:04

    //这个时间复杂度为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;
    

    }

    
    
    点赞 打赏 评论
  • hellorichen 2016-11-10 05:07
     for(int k =0; k<i; k++)
            {
                p=0;
                if(str[k]==str[i])
                    p=1;
            }
    

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

    点赞 打赏 评论
  • 智者知已应修善业 2016-11-10 06:47
    /*题目要求:编写一个函数,计算字符串中含有的不同字符的个数。字符在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;

    点赞 打赏 评论
  • viewgroup 2016-11-10 08:56
    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;
    }
    
    
    
    点赞 打赏 评论
  • viewgroup 2016-11-10 08:59
    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;
    }
    
    
    
    点赞 打赏 评论
  • ah_107 2016-11-13 03:09

    string str;
    vectorv1;
    cin >> str;
    for (int i = 0; i < str.size(); i++)
    {
    if (str[i]>127 || str[i] < 0)
    throw runtime_error("超出ASIIC码范围" + str[i]);
    v1.push_back(str[i]);//放到容器中
    }
    sort(v1.begin(), v1.end());
    auto end_unique = unique(v1.begin(), v1.end());
    v1.erase(end_unique, v1.end());
    cout << v1.size();
    return 0;
    }
    这边的主要思路是,先将str里的字符进行排序,然后消除掉相邻处相同的字符,此时,字符的长度就是所有不同字符的个数了

    点赞 打赏 评论
  • NK_test 2016-11-13 15:33

    hash array or map

    点赞 打赏 评论

相关推荐 更多相似问题