C++实现 LeetCode 1796:找出字符串中第二大的数字
在 LeetCode 第 1796 题中,我们需要处理包含小写字母和数字的混合字符串,目标是找到其中严格小于最大值的最大整数。通过创建一个固定大小的布尔数组来标记数字的出现情况,可以从后向前仅需一次线性扫描便得出结论。
问题分析与逻辑梳理
本题的核心在于理解“第二大”的定义。它指的是集合中排在第二位的数值,例如若字符串中包含 {1, 2, 3},则第二大的是 2;若仅存在 {1},则没有第二大数字,应返回 -1。
关键点:重复的数字只算一次。例如输入 s = "abc1111" 时,集合中只有 {1},不存在比 1 小的正整数(在 0-9 范围内且必须存在),因此结果为 -1。
C++ 代码实现
以下代码展示了如何提取字符并判断逻辑,使用了固定容量的 bool 数组来提高效率:
class Solution {
public:
int secondHighest(string& s) {
// 记录 0-9 是否出现
bool digits[10] = {false};
for (char c : s) {
if (c >= '0' && c <= '9') {
digits[c - '0'] = true;
}
}
bool foundFirst = false; // 记录是否已发现最大值
for (int i = 9; i >= 0; i--) {
if (digits[i]) {
if (foundFirst) {
// 第二次遇到存在的数字,即为第二大
return i;
} else {
// 第一次遇到的数字,标记为最大值
foundFirst = true;
}
}
}
return -1;
}
};本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













