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
唯一的错误是getline
。getline
会读入行末的回车字符('\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 是不是数组开足够多的空间就够了吗