题目描述
给你一个混合字符串 s ,请你返回 s 中 第二大 的数字,如果不存在第二大的数字,请你返回 -1 。
混合字符串 由小写英文字母和数字组成。
示例
示例 1:
输入:s = “dfa12321afd”
输出:2
解释:出现在 s 中的数字包括 [1, 2, 3] 。第二大的数字是 2 。
示例 2:
输入:s = “abc1111”
输出:-1
解释:出现在 s 中的数字只包含 [1] 。没有第二大的数字。
提示
1 <= s.length <= 500
s 只包含小写英文字母和(或)数字。
思路
- 初始化最大数字max和第二大数字secondmax
- 对s从左向右循环遍历
- 判断该位是数字吗
- 如果是数字,将本位与最大的数字比较
- 如果比最大的数字大,第二大数字=原来的最大数字,新的最大数字=本位
- 如果比最大的数字小,比第二大的数字大,第二大数字=本位
java实现
class Solution {
public int secondHighest(String s) {
// 1. 初始化最大数字max和第二大数字secondmax
int max=-1;
int secondmax=-1;
int i=0;
int num=0;
// 2. 对s从左向右循环遍历
for(i=0;i<s.length();i++)
{
// 3. 判断该位是数字吗
if(Character.isDigit(s.charAt(i)))
{
num = s.charAt(i)-'0';
//4. 如果是数字,将本位与最大的数字比较
//5. 如果比最大的数字大,第二大数字=原来的最大数字,新的最大数字=本位
if(num>max)
{
secondmax = max;
max = num;
}
//6.如果比最大的数字小,比第二大的数字大,第二大数字=本位
else if(num>secondmax && num<max)
{
secondmax = num;
}
}
}
return secondmax;
}
}
python实现
class Solution:
def secondHighest(self, s: str) -> int:
num = 0
# 1. 初始化最大数字max和第二大数字secondmax
max,secondmax = -1,-1
# 2. 对s从左向右循环遍历
for sword in s:
# 3. 判断该位是数字吗
if sword.isdigit():
num = int(sword)
#4. 如果是数字,将本位与最大的数字比较
#5. 如果比最大的数字大,第二大数字=原来的最大数字,新的最大数字=本位
if num>max:
secondmax = max
max = num
#6.如果比最大的数字小,比第二大的数字大,第二大数字=本位
elif num>secondmax:
if num<max:
secondmax = num
return secondmax
C++实现
class Solution {
public:
int secondHighest(string s) {
// 1. 初始化最大数字max和第二大数字secondmax
int max = -1;
int secondmax = -1;
int i = 0;
int num = 0;
//2. 对s从左向右循环遍历
for(i=0;i<s.length();i++)
{
// 3. 判断该位是数字吗
if(s[i]>='0' && s[i]<='9')
{
num = s[i]-'0';
// 4. 如果是数字,将本位与最大的数字比较
// 5. 如果比最大的数字大,第二大数字=原来的最大数字,新的最大数字=本位
if(num>max)
{
secondmax = max;
max = num;
}
// 6. 如果比最大的数字小,比第二大的数字大,第二大数字=本位
else if(num<max &&num>secondmax)
{
secondmax = num;
}
}
}
return secondmax;
}
};