【坚持不懈的每日一题——力扣篇】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<int> 类型变量 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;
    }
};

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();
    }
};

四、拓展 —> 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);

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

请添加图片描述


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

扑腾的江鱼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值