刷题的日常-字符串中第二大的数字

72 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
    }
}

image.png