「遍历」字符串中第二大的数字(力扣第1796题)
  yNNxBP7kKRWF 2023年11月01日 113 0

本题为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;
    }
};

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  jTMfQq5cr55P   2024年05月17日   42   0   0 算法与数据结构
  jTMfQq5cr55P   2024年05月17日   38   0   0 算法与数据结构
yNNxBP7kKRWF