给你一个混合字符串 s ,请你返回 s 中 第二大 的数字,如果不存在第二大的数字,请你返回 -1 。
混合字符串 由小写英文字母和数字组成。
示例 1:
**输入:** s = "dfa12321afd"
**输出:** 2
**解释:** 出现在 s 中的数字包括 [1, 2, 3] 。第二大的数字是 2 。
示例 2:
**输入:** s = "abc1111"
**输出:** -1
**解释:** 出现在 s 中的数字只包含 [1] 。没有第二大的数字。
提示:
1 <= s.length <= 500
s 只包含小写英文字母和(或)数字。
方法一:直接遍历
思路与算法
题目要求找到字符串 s 中第二大的数字,我们用 first、second 分别记录 s 中第一大的数字与第二大的数字,且初始化时二者均为 -1,当我们遍历字符串中第 i 个字符 s[i] 时:
如果第 s[i] 为字母则跳过;
如果第 s[i] 为数字,则令 num 表示 s[i] 对应的十进制数字:
如果满足 num} > \textit{first,则当前最大的数字为 num,第二大的数字为 first,则此时更新 second 等于当前的 first,更新当前的 first 为 num 即可。
如果满足 second} < \textit{num} < \textit{first,则当前最大的数字为 first,第二大的数字为 num,则此时更新当前的 second 为 num 即可。
如果满足 num} \le \textit{second,则此时不需要任何更新。
最终返回第二大数字 second 即可。
代码
[sol1-Python3]
1 2 3 4 5 6 7 8 9 10 11 12
classSolution: defsecondHighest(self, s: str) -> int: first = second = -1 for c in s: if c.isdigit(): num = int(c) if num > first: second = first first = num elif second < num < first: second = num return second
[sol1-C++]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution { public: intsecondHighest(string s){ int first = -1, second = -1; for (auto c : s) { if (isdigit(c)) { int num = c - '0'; if (num > first) { second = first; first = num; } elseif (num < first && num > second) { second = num; } } } return second; } };
[sol1-Java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution { publicintsecondHighest(String s) { intfirst= -1, second = -1; for (inti=0; i < s.length(); i++) { charc= s.charAt(i); if (Character.isDigit(c)) { intnum= c - '0'; if (num > first) { second = first; first = num; } elseif (num < first && num > second) { second = num; } } } return second; } }
[sol1-C#]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
publicclassSolution { publicintSecondHighest(string s) { int first = -1, second = -1; foreach (char c in s) { if (char.IsDigit(c)) { int num = c - '0'; if (num > first) { second = first; first = num; } elseif (num < first && num > second) { second = num; } } } return second; } }
[sol1-C]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
intsecondHighest(char * s) { int first = -1, second = -1; for (int i = 0; s[i]; i++) { if (isdigit(s[i])) { int num = s[i] - '0'; if (num > first) { second = first; first = num; } elseif (num < first && num > second) { second = num; } } } return second; }
[sol1-JavaScript]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
var secondHighest = function(s) { let first = -1, second = -1; for (let i = 0; i < s.length; i++) { const c = s[i]; if ('0' <= c && c <= '9') { const num = c.charCodeAt() - '0'.charCodeAt(); if (num > first) { second = first; first = num; } elseif (num < first && num > second) { second = num; } } } return second; };
[sol1-Golang]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
funcsecondHighest(s string)int { first, second := -1, -1 for _, c := range s { if unicode.IsDigit(c) { num := int(c - '0') if num > first { second = first first = num } elseif second < num && num < first { second = num } } } return second }