相信你是最棒哒!!!
问题描述
给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。
输入
一个字符串,长度小于100000。
输出
输出第一个仅出现一次的字符,若没有则输出no。
样例输入
abcabd
样例输出
c
正确代码
法一注释版
#include<stdio.h>
#include<string.h>
int main()
{
char a[100000];
// 使用scanf函数读取一个字符串,存储到数组a中
// 检查scanf的返回值,确保成功读取了一个字符串
if(scanf("%s", a) == EOF)
{
return 1; // 如果输入失败(到达文件末尾或读取错误),返回1表示程序异常结束
}
int len = strlen(a); // 计算字符串a的长度,并存储在变量len中
//使用for循环遍历字符串a
for (int i = 0; i < len; i++)
{
int sum = 0; // sum用于记录字符a[i]在字符串中出现的次数,每次内循环结束sum都更新一次
// 再次使用for循环遍历字符串a
for (int j = 0; j < len; j++)
{
// 如果当前字符a[i]与遍历到的字符a[j]相同
if (a[i] == a[j])
{
sum++; // 增加sum的值
}
}
// 如果字符a[i]在整个字符串中只出现了一次
if (sum == 1)
{
printf("%c", a[i]); // 打印这个字符
return 0; // 返回0,表示程序正常结束
}
}
// 如果遍历完整个字符串都没有找到只出现一次的字符,打印"no"
printf("no");
return 0; // 返回0,表示程序正常结束
}
简洁版
#include<stdio.h>
#include<string.h>
int main()
{
char a[100000];
if(scanf("%s", a) == EOF)
{
return 1;
}
int len = strlen(a);
for (int i = 0; i < len; i++)
{
int sum = 0;
for (int j = 0; j < len; j++)
{
if (a[i] == a[j])
{
sum++;
}
}
if (sum == 1)
{
printf("%c", a[i]);
return 0;
}
}
printf("no");
return 0;
}
法二注释版
#include<stdio.h>
int main()
{
char a[100000];
scanf("%s", a);
for (int i = 0; i < strlen(a); i++) // 遍历字符串a中的每个字符
{
int sum = 0; // sum记录字符a[i]出现的次数,sum经常更新
for (int j = 0; j < strlen(a); j++) // 再次遍历字符串a
{
if (a[i] == a[j]) // 如果当前字符a[i]与遍历到的字符a[j]相同
{
sum++; // 增加sum的值
}
}
if (sum == 1) // 如果字符a[i]在整个字符串中只出现了一次
{
printf("%c", a[i]); // 打印这个字符,并结束程序
return 0; // 返回0,表示程序正常结束
}
}
printf("no"); // 如果遍历完整个字符串都没有找到只出现一次的字符,打印"no"
return 0;
}
简洁版
#include<stdio.h>
int main()
{
char a[100000];
scanf("%s", a);
for (int i = 0; i < strlen(a); i++)
{
int sum = 0;
for (int j = 0; j < strlen(a); j++)
{
if (a[i] == a[j])
{
sum++;
}
}
if (sum == 1)
{
printf("%c", a[i]);
return 0;
}
}
printf("no");
return 0;
}
法三注释版
#include<stdio.h>
#include<string.h>
char a[1000010];
int s[1000]; // 定义一个整型数组s,大小为1000,用于存储每个字符出现的次数,假设字符范围是0-999
int f = 0; // 定义一个标志变量f,用于标记是否找到了唯一字符,初始值为0
int main()
{
scanf("%s", a); // 使用scanf函数读取一个字符串,存储到数组a中
int n = strlen(a); // 计算字符串a的长度,并存储在变量n中
// 使用for循环遍历字符串a中的每个字符
for (int i = 0; i < n; i++)
{
s[a[i]]++; // 增加字符a[i]在数组s中对应位置的计数
}
// 再次使用for循环遍历字符串a中的每个字符
for (int i = 0; i < n; i++)
{
if (s[a[i]] == 1) // 如果字符a[i]在数组s中的计数为1,即这个字符只出现了一次
{
f = 1; // 将标志变量f设置为1
printf("%c", a[i]); // 打印这个唯一的字符
break; // 跳出循环
}
}
if (f == 0) // 如果标志变量f仍然为0,说明没有找到唯一的字符
{
printf("no"); // 打印"no"
}
return 0;
}
简洁版
#include<stdio.h>
#include<string.h>
char a[1000010];
int s[1000];
int f = 0;
int main()
{
scanf("%s", a);
int n = strlen(a);
for (int i = 0; i < n; i++)
{
s[a[i]]++;
}
for (int i = 0; i < n; i++)
{
if (s[a[i]] == 1)
{
f = 1;
printf("%c", a[i]);
break;
}
}
if (f == 0)
{
printf("no");
}
return 0;
}
这段代码的逻辑是:
- 读取一个字符串,并存储在数组a中。
- 计算字符串的长度,并存储在变量n中。
- 使用一个for循环遍历字符串中的每个字符,并增加字符在数组s中对应位置的计数。
- 再次使用一个for循环遍历字符串中的每个字符,如果找到计数为1的字符,即这个字符只出现了一次,就打印这个字符,并设置标志变量f为1,然后跳出循环。
- 如果循环结束后,标志变量f仍然为0,说明没有找到唯一的字符,就打印"no"。
这段代码假设输入的字符串只包含ASCII字符,且字符范围是0-999。如果输入的字符串包含其他字符,这个代码可能无法正确工作。