题目

给你一个混合字符串 s ,请你返回 s 中 第二大 的数字,如果不存在第二大的数字,请你返回 -1 。

混合字符串 由小写英文字母和数字组成。

示例 1:

1
2
3
输入:s = "dfa12321afd"
输出:2
解释:出现在 s 中的数字包括 [1, 2, 3] 。第二大的数字是 2

示例 2:

1
2
3
输入:s = "abc1111"
输出:-1
解释:出现在 s 中的数字只包含 [1] 。没有第二大的数字。

提示:

1 <= s.length <= 500
s 只包含小写英文字母和(或)数字。

解题思路

首先创建一个长度为2的数组,这里我取名nums

规定nums[0]为第一大的数,nums[1]为第二大的数

当遇到数字时:

  1. 大于nums[0],更新nums[0]为num,更新nums[1]nums[0]
  2. 小于nums[0]大于nums[1]更新nums[1],因为此时数字为第二大数字.

代码

Python

1
2
3
4
5
6
7
8
9
10
11
class Solution:
def secondHighest(self, s: str) -> int:
ans = [-1, -1]
for c in s:
if c.isdigit():
num = int(c)
if num > ans[0]:
ans[0], ans[1] = num, ans[0]
elif ans[1] < num < ans[0]:
ans[1] = num
return ans[1]

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
int secondHighest(string s) {
int nums[2] = {-1, -1};
for (auto c: s) {
if (isdigit(c) != 0) {
int num = int(c - '0');
if (num > nums[0]) {
nums[1] = nums[0];
nums[0] = num;
} else if (nums[1] < num && nums[0] > num) {
nums[1] = num;
}
}
}
return nums[1];
}
};

Go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
func secondHighest(s string) int {
var (
first = -1
second = -1
)
for _, c := range s {
if unicode.IsDigit(c) {
num := int(c - '0')
if num > first {
second = first
first = num
} else if second < num && first > num {
second = num
}
}
}
return second
}