开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情
刷题的日常-2022年12月3号
一天一题,保持脑子清爽
字符串中第二大的数字
来自leetcode的 1796 题,题意如下:
给你一个混合字符串
s,请你返回s中 第二大 的数字,如果不存在第二大的数字,请你返回-1。混合字符串 由小写英文字母和数字组成。
示例1:
输入:s = "dfa12321afd"
输出:2
解释:出现在 s 中的数字包括 [1, 2, 3] 。第二大的数字是 2。
理解题意
通过题意,我们可以将信息整理如下:
- 题目给出一个字符串,字符串由小写英文字母 和 数字组成
- 要求我们返回第二大的数字
做题思路
简单题,一开始理解错了,以为是要找到第二小的数字,提交发现没有通过,还以为是用例的问题。查看评论才发现不止我一个看走眼的 (*^_^*)。
题目中要求统计的是第二大的数字,而数字只有 0 - 9 这十个,所以可以开辟个大小为10的数组记录数字是否出现,然后扫描字符串,将出现的数字进行标记,最后返回第二大的数字即可,步骤如下:
- 开辟一个大小为10的数组
- 开辟一个变量res记录结果,开辟一个cnt变量用来统计当前是第几大的数据
- 对数组进行预处理,将出现的数字在数组中标出
- 然后从后往前扫描数组,并进行统计
- 如果统计等于二,相当于找到了第二大的数,直接返回即可
- 如果没有找到,返回-1
代码实现
代码实现如下:
public class Solution {
public int secondHighest(String s) {
int[] numMap = new int[10];
int res = -1, cnt = 0, num;
char c;
for (int i = 0; i < s.length(); i++) {
c = s.charAt(i);
if (!Character.isDigit(c)) {
continue;
}
numMap[c - '0'] = 1;
}
for (int i = numMap.length - 1; i >= 0; i--) {
num = numMap[i];
cnt += num;
if (cnt == 2) {
res = i;
break;
}
}
return res % 10;
}
}