1. 程式人生 > 其它 >「遍歷」字串中第二大的數字(力扣第1796題)

「遍歷」字串中第二大的數字(力扣第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;
    }
};

"正是我們每天反覆做的事情,最終造就了我們,優秀不是一種行為,而是一種習慣" ---亞里士多德