3.【刷爆LeetCode】找出字符串中第一个只出现一次的字符(多方法、多思路)

目录

总体概述:

思路一:遍历查找

计数器的思想:

思路二:精准查找

思路对比


        大家好我是Liyuyue!

        本专栏会将本博主刷题历程记录并总结下来,出成讲解的方式供给大家一起学习!

        接下来我会讲我刷的LeetCode好题用到的思路、方法分享给大家一起学习,如果大家在看的过程中还有好的方法,可以评论区或者直接找我继续讨论。

        如果大家有需要出讲解的题可以给我评论或者私聊我,我帮大家试试水~!给大家一个满意的讲解~!     

        感谢大家的支持~!


找出字符串中第一个只出现一次的字符

总体概述:

        这个题的意思也就是可能有三种情况:

  1. 出现的字符都是出现了多次。
  2. 出现的字符有多个只出现了一次,但是输出首个(第一次)出现的字符。
  3. 出现的字符只有一个。

        所以在写的时候要注意这三种情况!

        在解这个题的时候,我们要统计出现的字符出现次数:

  1. 如果出现一次的只有一个,则输出这个字符
  2. 如果有两个出现一次的,则输出最前面的字符
  3. 如果都没有出现一次的,则输出-1

思路一:遍历查找

计数器的思想:

        首先这个题是要用到计数器的思想!!!

        计数器的思想:就是当这个数字出现了,然后相应的下标进行++,所以需要创建一个数组:

          依次记录:

         按照上面的方法依次记录,最后得到的数组就是arr里 从0到6,每个数出现了几次,再根据最开始讲的那三种情况进行分析。

        这里要注意的是,这道题是出现的字符,不是数字,但是也相同,因为从 'a' 到 'z' 有26个字母,那么用对应的字符 - 'a' 得到的就是下标为 '0' - '25' 是数字。这里只要注意转化一下就好了!!!

        因为这个方法是 遍历查找 所以写出的代码思路是:

        先从自己定义的c数组里找为 '1' 的值,然后根据这个为 '1' 的值的下标去在给定的字符串arr中找对应的字母,看这个字母是不是比其他在c数组里为 '1' 的字母靠前,取考前的那一个,这里只需要用判断语句进行判断即可~!

        我将代码给大家并给代码加上了注释,大家根据我给的思路进行分析!

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s;
    cin >> s;
    int count_cnt[26] = { 0 };
    int sz = s.size(); // 个数
    for(int i = 0; i < sz; i++) // 遍历计数
        count_cnt[s[i] - 'a']++;
    char first;
    int flag = 1;
    int count = sz; // count表示数组最后一个位置‘/0’
    for(int i = 0; i < 26 ; i++)
    {
        if(count_cnt[i] == 1) // 出现一次
        {
            flag = -1; // 证明有出现一次的
            for(int j = 0; j < sz ;j++ )
            {
                if(s[j] == i + 'a' && count > j) // 如果找到了那个字母,而且位置靠前
                {
                    count = j; // 更新count的位置
                    first = s[j]; // 记录这个出现依次的字母
                    break;
                }
            }
        }
    }
    if(flag == -1)
        cout << first;
    else
        printf("%d",-1);
    return 0;
}

思路二:精准查找

        这个思路也要用到计数器的思想,和上面的思路前面一样,所以前面的就不讲了。

        因为这个方法是 遍历查找 所以写出的代码思路是:

        从给定的字符串中遍历字符,看看这个字符在自己定义的c数组中出现了几次,出现了多次则继续遍历给定的数组,直到遍历出来这个字符在自己定义的c数组中出现了1次的字符,那么输出这个字符。如果没遍历出来,直接输出 -1 。

        我将代码给大家并给代码加上了注释,大家根据我给的思路进行分析!

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s;
    cin >> s;
    int count_cnt[26] = { 0 };
    int sz = s.size(); // 个数
    for(int i = 0; i < sz; i++) // 遍历计数
        count_cnt[s[i] - 'a']++;
    int flag = 1;
    int count = 0;
    for(int i = 0; i < s.size() ; i++)
        {
            if(count_cnt[s[i] - 'a'] == 1) // 遍历给定字符串,找出第一个只
            {                              // 出现一次字符,直接输出
                count = i;
                flag = -1;
                break; // 一定要记得break,否则后面还有出现一次的会顶替掉。
            }
        }
    if(flag == -1)
        cout << s[count];
    else
        printf("%d",-1);
    return 0;
}

思路对比

        这两个思路我认为思路二更巧妙,思路一就略显 '鲁莽' 。

        因为思路一是只要是1就去看看他靠不靠前

        思路二则是,看看前面的是不是1,不是1就不费事了,直接跳过看下一个,是1的话那就是它,我直接输出它就完了

        这么一看是不是感觉思路二更巧妙些呢~我是这么想的,大家可以在评论区给出你的见解。

        但是两个思路都很好,我说的更巧妙,只是在它的操作方式上,思路都是很好的,没有问题~!

        如上就是 找出字符串中第一个只出现一次的字符 的解析,接下来本专辑会持续更新【刷爆LeetCode】,和大家一起爆扣LeetCode!!!,如果大家喜欢看此文章并且有收获,可以时刻关注我,本专栏持续更新!

        感谢大家观看,感谢大家支持!

  • 12
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NPC Online

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值