「遍历」字符串中第二大的数字(力扣第1796题)
本题为12月3日力扣每日一题
题目来源:力扣第1796题
题目tag:遍历
题面
题目描述
给你一个混合字符串s,请你返回s中第二大的数字,如果不存在第二大的数字,请你返回-1
。
混合字符串由小写英文字母和数字组成。
示例
示例 1
输入:
s = "dfa12321afd"
输出:
2
解释:
出现在s中的数字包括[1, 2, 3]。第二大的数字是2。
示例 2
输入:
s = "abc1111"
输出:
-1
解释:
出现在s中的数字只包含[1]。没有第二大的数字。
提示
1 <= s.length <= 500
s 只包含小写英文字母和(或)数字。
思路分析
很简单的一道遍历题,直接遍历整个字符串,处理其中的数字即可.
可能对于以前没有做过找第二大数据的新人朋友来说,更新第二大写起来有些困难.其实只要清楚第二大数字的来源即可,其来源只可能有两个:
- 比最大小而比第二大大的数字
- 原本的最大数字被一个更大的数字更新之后,就是第二大的数字了
所以只需要在最大被替换后对第二大进行更新即可,这里做法有很多,不一定要按我这样做.
参考代码
class Solution
{
public:
int secondHighest(string s)
{
int maxDig = -1, max2Dig = -1; // 最大和次大数字
for (auto c : s)
{
if (c >= '0' && c <= '9') // 当前是数字
{
if (c - '0' > maxDig) // 比最大的要大
{
int t = maxDig;
maxDig = c - '0'; // 更新最大
c = t + '0'; // 最大可能成为第二大,所以需要保留
}
if (c - '0' < maxDig && c - '0' > max2Dig) // 比最大小但是比第二大大
{
max2Dig = c - '0';
}
}
}
return max2Dig;
}
};
"正是我们每天反复做的事情,最终造就了我们,优秀不是一种行为,而是一种习惯" ---亚里士多德
这里是浙江理工大学22届ACM集训队的成员一枚鸭!
本文首发于博客园,作者:星双子,除了我自己的转载请注明原文链接:https://www.cnblogs.com/geministar/p/LeetCode1796.html