[洛谷]B2110 找第一个只出现一次的字符

传送门:找第一个只出现一次的字符 - 洛谷

审题

变量要求

只包含小写字母字符串 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值