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’;
- 当 s[i] 为数字时:
- 返回第二大数字 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);
关注公众号,感受不同的阅读体验
下期预告: 明天的每日一题