「遍历」字符串中第二大的数字(力扣第1796题)

本题为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 <= '9') // 当前是数字
            {
                if (c - '0' > maxDig) // 比最大的要大
                {
                    int t = maxDig;
                    maxDig = c - '0'; // 更新最大
                    c = t + '0';      // 最大可能成为第二大,所以需要保留
                }
                if (c - '0' < maxDig && c - '0' > max2Dig) // 比最大小但是比第二大大
                {
                    max2Dig = c - '0';
                }
            }
        }
        return max2Dig;
    }
};

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

posted @ 2022-12-03 12:36  星双子  阅读(61)  评论(0编辑  收藏  举报