「遍歷」字串中第二大的數字(力扣第1796題)
阿新 • • 發佈:2022-12-03
本題為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 只包含小寫英文字母和(或)數字。
思路分析
很簡單的一道遍歷題,直接遍歷整個字串,處理其中的數字即可.
可能對於以前沒有做過找第二大資料的新人朋友來說,更新第二大寫起來有些困難.其實只要清楚第二大數字的來源即可,其來源只可能有兩個:
- 比最大小而比第二大大的數字
- 原本的最大數字被一個更大的數字更新之後,就是第二大的數字了
所以只需要在最大被替換後對第二大進行更新即可,這裡做法有很多,不一定要按我這樣做.
參考程式碼
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; } };
"正是我們每天反覆做的事情,最終造就了我們,優秀不是一種行為,而是一種習慣" ---亞里士多德