1796. 字符串中第二大的数字

108 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情

题目 leetcode.cn/

  • 给你一个混合字符串 s ,请你返回 s 中 第二大 的数字,如果不存在第二大的数字,请你返回 -1 。
  • 混合字符串 由小写英文字母和数字组成。

示例

  • 输入: s = "dfa12321afd";输出: 2

    • 解释: 出现在 s 中的数字包括 [1, 2, 3] 。第二大的数字是 2 。
  • 输入: s = "abc1111";输出: -1

    • 解释: 出现在 s 中的数字只包含 [1] 。没有第二大的数字。

提示

  • 1 <= s.length <= 500
  • s 只包含小写英文字母和(或)数字。

代码

function secondHighest(s: string): number {
    let nums = [];
    for(let i = 0; i < s.length; i++){
        if(!Number.isNaN(Number(s[i]))){
            nums.push(Number(s[i]));
        }
    }
    let sortNums = [... new Set(nums)]
    let result = sortNums.sort((a, b) => { return b - a; });
    return result.length <= 1 ? -1 : result[1];
};

思路

  • 题目要求返回字符串中第二大的数字,但是给到的字符串中不仅仅只包括数字,还包括字母。所以首先要区分出是数字还是字母,然后才能去查找数字中的第二大数字

    • 如何区分是数字还是字母:首先遍历整个字符串,把字符串中的每一个字符都取出来,然后区分是字符串数字还是字符串字母。
    • 首先可以用正则匹配,检查当前字符串是不是字母字符串或者数字字符串:检查是否由小写字母字符串/^[a-z]+$/i,检查是否是数字字符串/^\d+$/
    • 还可以使用Number的构造方法,把每个字符串传入构造方法,如果传入的是数字字符串,返回该数字字符串的number类型的数字,如果是字符串字母,返回的是NaN。再通过判断返回值是否是NaN来判断当前字符串是不是数字字符串
    • 怎么判断返回值是否是NaN,不能直接使用===,因为NaN === NaN返回的false,这样不能比较出当前是否是NaN。也不能用type of,因为type of NaN返回的也是number类型。Number上有一个isNaN方法,可以直接使用,如果是NaN则返回true,如果不是则返回false
  • 将拿到的所有数字保存到数组变量中,再使用new Set()对拿到的数字去重,避免所有的数字都是相同的,这样就没有第二大的数字

  • 然后将去重后的数数组降序排序,如果去重后的数组内数字大于等于2个,那么第二大的数字就是数组的第二个,即下标为1的,如果去重后的数组内数字个数小于2个,那么不会存在第二大的数字直接返回-1即可。