• 【坚持不懈的每日一题——力扣篇】1796. 字符串中第二大的数字(简单)+set 用法复习



    GitHub同步更新(已分类)Data_Structure_And_Algorithm-Review

    公众号:URLeisure 的复习仓库
    公众号二维码见文末

    以下是本篇文章正文内容,下面案例可供参考。


    一、题目描述

    • 力扣今天推的每日一题是道简单题,没有难度,主要用来复习 set 。

    在这里插入图片描述

    • 示例一:

    输入:s = “dfa12321afd”
    输出:2
    解释:出现在 s 中的数字包括 [1, 2, 3] 。第二大的数字是 2 。

    • 示例二:

    输入:s = “abc1111”
    输出:-1
    解释:出现在 s 中的数字只包含 [1] 。没有第二大的数字。

    • 提示
    • 1 <= s.length <= 500
    • s 只包含小写英文字母和(或)数字。

    二、解题思路

    1. 直接遍历

    • 定义两个变量 first 和 second,初始化为 -1,分别用来存储 最大第二大 数字;
    • 遍历字符串 s
      • 当 s[i] 为数字时:
        • 如果 s[i] - ‘0’ > first,则这时的最大数字为 first = s[i] - ‘0’,并且将第二大数字 second 更新,second = first;
        • 如果 s[i] - ‘0’ < first 并且 s[i] - ‘0’ > second,此时 s[i] 存储的数字比最大数字小,但比第二大数字大,只用更新第二大数字 second = s[i] - ‘0’;
    • 返回第二大数字 second。

    2. set 去重

    • 定义一个 set 类型变量 st;
    • 遍历字符串 s
      • 当 s[i] 为数字时,存入 st;
    • 如果 st 元素数量小于等于 1,返回 -1;
    • 删除 st 中最大的数字,即 st 中最后一个元素;
    • 返回 st 中最后一个元素的值。

    三、解题代码

    1. 直接遍历

    class Solution {
    public:
        int secondHighest(string s) {
            int first = -1, second = -1;
            for (char ch: s) {
                if (ch >= '0' && ch <= '9') {
                    if (ch - '0' > first) {
                        second = first;
                        first = ch - '0';
                    } else if (ch - '0' > second && ch - '0' != first) second = ch - '0';
                }
            }
            return second;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2. set 去重

    class Solution {
    public:
        int secondHighest(string s) {
            set<int> st;
            for (char ch: s) {
                if (ch >= '0' && ch <= '9') {
                    st.insert(ch - '0');
                }
            }
            if (st.size() <= 1) return -1;
            st.erase(*st.rbegin());
            return *st.rbegin();
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    四、拓展 —> set 用法复习

    • set 在 STL 的分类中属于 关联式容器,底层实现为红黑树(RB 树,Red-Black Tree)。

    • set 中元素有序且不可重复、不可更改,查询效率为 O ( l o g n ) O(logn) O(logn),增删效率为 O ( l o g n ) O(logn) O(logn)

    set 中常用的方法:

    insert(key_value)-------向 set 中插入 key_value
    begin()-----返回 set 容器第一个元素的迭代器
    end()--------返回 set 容器最后一个元素的迭代器
    clear()-------删除 set 容器中的所有的元素
    empty()-----判断 set 容器是否为空
    size()--------返回当前 set 容器中的元素个数
    rbegin()-----返回指向容器中最后一个元素的反向迭代器
    rend()-------返回指向容器中第一个元素的反向迭代器
    erase(iterator)------删除某个迭代器指向的值
    find(key_value)----返回key_value的迭代器,如果没找到则返回 end()。
    lower_bound(key_value) ----返回第一个大于等于 key_value 的迭代器
    upper_bound(key_value)----返回最后一个大于等于 key_value 的迭代器

    set<int> st;
    
    st.clear();
    
    st.insert(1);
    st.insert(2);
    st.insert(3);
    
    int length = st.size();
    
    set<int>::iterator it1, it2, it3, it4;
    set<int>::reverse_iterator rit1, rit2;
    it1 = st.begin();
    it2 = st.end();
    rit1 = st.rbegin();
    rit2 = st.rend();
    
    st.erase(it1);
    
    it3 = st.lower_bound(2);
    it4 = st.upper_bound(2);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    关注公众号,感受不同的阅读体验

    请添加图片描述


    下期预告: 明天的每日一题

  • 相关阅读:
    【javaEE】网络原理(网络层)
    一个react前端项目中的配置文件作用解析
    【(数据结构)—— 基于单链表实现通讯录】
    大数据管道聚合并分页 有什么调优方案
    海泰方圆成功举办“引领数据安全创新,加速数字经济发展”技术研讨会
    java面试题
    力扣刷题day43|123买卖股票的最佳时机III、188买卖股票的最佳时机IV
    第五十五章 使用 NSD (Windows) - 在备用 TCP 端口上启动 NSD
    [AHK]安信猎豹自动下单
    【教3妹学mysql】联合索引问题优化
  • 原文地址:https://blog.csdn.net/weixin_50564032/article/details/128159718