两个测试点过不去,求大佬帮忙康康

B2110 找第一个只出现一次的字符

zdzdzd71 @ 2021-12-24 16:03:04

#include<stdio.h>
#include<string.h>
int main()
{
    char arr[1105];
    scanf("%s",arr);
    int letter[10000]={0};
    for(int i=0;i<strlen(arr);i++)
    {
        letter[arr[i]]++;

    }
    int flag=1;
    for(int i=0;i<1000;i++)
    {
        if(letter[i]==1)
        {
            flag=0;
            printf("%c",i);
            break;
         } 
    }
    if(flag)printf("no");
    return 0;
}

by int_R @ 2021-12-24 16:55:21

是要按照输入顺序而不是字典序吧


by DengStar @ 2021-12-24 17:07:54

for(int i=0;i<1000;i++)
    {
        if(letter[i]==1)
        {
            flag=0;
            printf("%c",i);
            break;
         } 
    }

这里出了问题。注意题目是第一个仅出现一次的字符,而你的方法不能保证找到的字符是第一个出现的。正确的做法是:

for(int i=1;i<=len;i++)
{
        if(letter[arr[i]]==1)
        {
            flag=0;
            printf("%c",arr[i]);
            break;
        }
}

除此之外,你的letter[]数组定义在了主函数里面,这会导致两个问题:1.数组元素初值不为零(定义在主函数外面数组的每一个元素都是零);2.主函数用的是栈空间,这样做容易爆栈。因此数组最好定义在主函数外面(arr[]数组也一样)。


by zdzdzd71 @ 2021-12-25 10:55:44

@初一11班刘宇轩 说得对!%%%


by zdzdzd71 @ 2021-12-25 10:56:22

@RDFZdsd 谢谢!!%%%


by ZLL_LOve @ 2022-03-25 18:50:45

@RDFZdsd 为什么我按照你说的 把数组定义在主函数外 之前的七个样例本来AC的 结果全报了RE


by DengStar @ 2022-03-26 12:08:27

@耄耋ll 发一下代码?


by ZLL_LOve @ 2022-03-27 19:56:48

#include<bits/stdc++.h>
#include<string>
using namespace std;
int t[27];
int main()
{   

    int i,n,j;
    string s;
    getline(cin,s);
    int len=s.length();
    for(i=0;i<len;i++)
    {
       t[s[i]-'a'+1]++;
    }
    for(i=0;i<len;i++)
    {
        if(t[s[i]-'a'+1]==1)
        {
            cout<<s[i];
            return 0;
        }
    }
    cout<<"no";
    return 0;
}

@RDFZdsd


by ZLL_LOve @ 2022-03-27 19:57:26

@RDFZdsd 你用这个跑一下


by DengStar @ 2022-03-28 18:12:17

@耄耋ll 唯一的错误是getlinegetline会读入行末的回车字符('\n''\r'),然后在t[s[i]-'a'+1]这里就爆掉了,所以我建议你用cin。 AC Code:

#include<bits/stdc++.h>
#include<string>
using namespace std;
int t[27];
int main()
{   

    int i,n,j;
    string s;
    getline(cin,s);
    int len=s.length();
    for(i=0;i<len;i++)
    {
       if(s[i]!='\n'&&s[i]!='\r')   t[s[i]-'a'+1]++;
    }
    for(i=0;i<len;i++)
    {
        if(t[s[i]-'a'+1]==1)
        {
            cout<<s[i];
            return 0;
        }
    }
    cout<<"no";
    return 0;
}

by ZLL_LOve @ 2022-03-28 19:27:07

@RDFZdsd 太感谢了 谢谢 谢谢 谢谢 按照你说的 改成cin过后就AC了 谢谢你的回复 因为之前用cin 不能读空格的字符串 所以我这题就没注意 如果我要用getline 是不是数组开足够多的空间就够了吗


|