本题为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只包含小写英文字母和(或)数字。


思路分析

很简单的一道遍历题,直接遍历整个字符串,处理其中的数字即可.

可能对于以前没有做过找第二大数据的新人朋友来说,更新第二大写起来有些困难.其实只要清楚第二大数字的来源即可,其来源只可能有两个:

  1. 比最大小而比第二大大的数字
  2. 原本的最大数字被一个更大的数字更新之后,就是第二大的数字了

所以只需要在最大被替换后对第二大进行更新即可,这里做法有很多,不一定要按我这样做.

参考代码

class Solution{public:    int secondHighest(string s)    {        int maxDig = -1, max2Dig = -1; // 最大和次大数字        for (auto c : s)        {            if (c >= '0' && c  maxDig) // 比最大的要大                {                    int t = maxDig;                    maxDig = c - '0'; // 更新最大                    c = t + '0';      // 最大可能成为第二大,所以需要保留                }                if (c - '0'  max2Dig) // 比最大小但是比第二大大                {                    max2Dig = c - '0';                }            }        }        return max2Dig;    }};

“正是我们每天反复做的事情,最终造就了我们,优秀不是一种行为,而是一种习惯” —亚里士多德

这里是浙江理工大学22届ACM集训队的成员一枚鸭!

本文首发于博客园,作者:星双子,除了我自己的转载请注明原文链接:https://www.cnblogs.com/geministar/p/LeetCode1796.html