审题
变量要求
只包含小写字母的字符串 s ,它的长度 len
题目要求找出第一个只出现一次的字母,就需要一个记录字母的数组 t[26]
思路过程
输入既可以输入整行,又可以单独输入字符串,因为输入只包含一个字符串
我们需要记录字母,就需要遍历字符串,对每个字符进行记录
因为只包含小写字母,就只需要长度为 26 的数组就行了
用每个字符减去 'a' ,可以得出此字符在 26 个字母里是第几个,方便统计
统计代码如下
for(int i=0;i<len;i++){//字符串是从 0 开始,到 len-1 结束
t[s[i]-'a']++;// x++; 自增,等同于 x+=1;
//'a' 的 ASCLL 码是 97 所以可以相互代替
//因为小写 a ~ b 的 ASCLL 码是连续的,数组 t 的下表也是连续的
//把它们一一对应发现他们只相差 97 也就是小写 a 的 ASCLL 码
}
当我们对每个字符进行统计后,便得出的只出现一次的字符
要知道在它们之中谁是第一个,就需要知道它们在字符串中的先后顺序
这时再对数组进行遍历,就可以知道谁是第一个了
判断代码如下
char ans;//记录结果
for(int i=0;i<len;i++){
if(t[s[i]-'a']==1){
ans='a'+i;//对字母进行还原
break;//break; 跳出最近一层的循环,保证是第一个出现一次的字符,减少时间消耗
}
}
输出时还有一种结果——没有只出现一次的字符,输出 'no'
当出现这种情况时,ans 就不会被赋值,它就不是固定的值
那么我们就可以给 ans 赋初值(要避开字母)
如果它经过循环没有变,说明没有只出现一次的字符,就输出 'no'
输出代码如下
char ans='+';//不一定要是 '+'
for(int i=0;i<len;i++){
if(t[s[i]-'a']==1){
ans='a'+i;
break;
}
}
if(ans=='+'){//判断 ans 是否变化
cout<<"no";
}
else{
cout<<ans;
}
加上输入,答案就出来了
代码展示
#include<bits/stdc++.h>
using namespace std;
int len,t[26];
char ans='+';
string s;
int main()
{
cin>>s;
len=s.length();//求字符串长度
for(int i=0;i<len;i++){
t[s[i]-'a']++;
}
for(int i=0;i<len;i++){
if(t[s[i]-'a']==1){
ans=s[i];
break;
}
}
if(ans=='+'){
cout<<"no";
}
else{
cout<<ans;
}
return 0;
}