字符串中第二大的数字

141 阅读1分钟

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

题目描述

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

  • 示例 1
输入: s = "dfa12321afd"
输出: 2
解释: 出现在 s 中的数字包括 [1, 2, 3] 。第二大的数字是 2 。
  • 示例 2
输入: s = "abc1111"
输出: -1
解释: 出现在 s 中的数字只包含 [1] 。没有第二大的数字。

提示:

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

思路分析

根据题意可知,题目会给出一个混合字符串s,这个混合字符串是由小写字母和数字这两种组成的,没有别的特殊符号。现在需要我们在这里找出第二大的数字,若是能找出,就将这个数字返回出去,若是没有第二大数字就返回-1,比如只有一个数字或者所有的数值都是由一个数字组成的。
首先需要将字符串里面的所有数字全部都提取出来,然后组成一个纯数字的数组。这时候,在一个数字的集合里比大小就比较容易了,但是,这里可以不这么做,可以更简单的;将数组进行从小到大排序,一般来说,数组的倒数第二个就是第二大的数字了;不过有一个特殊的情况,就是由重复的数字,如果最后几个都是重复的数字,那倒数第二大的数字就不是倒数第二个了,所以我们先将数组去重,保证数组里面每个数字的唯一。还有就是,如果数组只有一个数字,那么这个数组里面也没有第二大数字。

AC代码

function solution(str) {
    let res = [];
    let leng = str.length;
    for(let i=0; i<=leng; i++) {
        if(parseInt(str[i]) >=0 && parseInt(str[i]) <= 9) {
            res.push(parseInt(str[i]))
        }
    }
    let resCopy = Array.from(new Set(res));
    if(resCopy.length <= 1) return -1;
    resCopy.sort((a,b) => a - b)
    return resCopy[resCopy.length-1];
}
let a = 'sdfdj2334jlk4j3kj3kjt43kj12jt3k2l3';
solution(a)