• 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' 的字母靠前,取考前的那一个,这里只需要用判断语句进行判断即可~!

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

    1. #include<iostream>
    2. #include<string>
    3. using namespace std;
    4. int main()
    5. {
    6. string s;
    7. cin >> s;
    8. int count_cnt[26] = { 0 };
    9. int sz = s.size(); // 个数
    10. for(int i = 0; i < sz; i++) // 遍历计数
    11. count_cnt[s[i] - 'a']++;
    12. char first;
    13. int flag = 1;
    14. int count = sz; // count表示数组最后一个位置‘/0’
    15. for(int i = 0; i < 26 ; i++)
    16. {
    17. if(count_cnt[i] == 1) // 出现一次
    18. {
    19. flag = -1; // 证明有出现一次的
    20. for(int j = 0; j < sz ;j++ )
    21. {
    22. if(s[j] == i + 'a' && count > j) // 如果找到了那个字母,而且位置靠前
    23. {
    24. count = j; // 更新count的位置
    25. first = s[j]; // 记录这个出现依次的字母
    26. break;
    27. }
    28. }
    29. }
    30. }
    31. if(flag == -1)
    32. cout << first;
    33. else
    34. printf("%d",-1);
    35. return 0;
    36. }

    思路二:精准查找

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

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

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

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

    1. #include<iostream>
    2. #include<string>
    3. using namespace std;
    4. int main()
    5. {
    6. string s;
    7. cin >> s;
    8. int count_cnt[26] = { 0 };
    9. int sz = s.size(); // 个数
    10. for(int i = 0; i < sz; i++) // 遍历计数
    11. count_cnt[s[i] - 'a']++;
    12. int flag = 1;
    13. int count = 0;
    14. for(int i = 0; i < s.size() ; i++)
    15. {
    16. if(count_cnt[s[i] - 'a'] == 1) // 遍历给定字符串,找出第一个只
    17. { // 出现一次字符,直接输出
    18. count = i;
    19. flag = -1;
    20. break; // 一定要记得break,否则后面还有出现一次的会顶替掉。
    21. }
    22. }
    23. if(flag == -1)
    24. cout << s[count];
    25. else
    26. printf("%d",-1);
    27. return 0;
    28. }

    思路对比

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

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

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

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

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

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

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

  • 相关阅读:
    DTC(diagnostic trouble code)
    73-Java的Collection集合:概述、体系特点、常用API、遍历方式、存储自定义类型的对象
    解决 This request has been blocked; this endpoint must be available over WSS.
    day04-MQ
    Java多并发(一)| 并发机制的底层原理(内存模型、重排序)
    【附源码】计算机毕业设计java缘来有交友平台系统设计与实现
    在liunx下读取串口的数据
    为什么大部分人做网赚是赚不到钱的,这才是真正的原因!
    防火墙nat策略实验和多出口实验和智能选路实验
    mysql实现按照自定义(指定顺序)排序
  • 原文地址:https://blog.csdn.net/weixin_69725192/article/details/125529542