开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
题目描述
给你一个混合字符串 s ,请你返回 s 中 第二大 的数字,如果不存在第二大的数字,请你返回 -1 。
混合字符串 由小写英文字母和数字组成。
来源:力扣(LeetCode)
- 示例 1
输入: s = "dfa12321afd"
输出: 2
解释: 出现在 s 中的数字包括 [1, 2, 3] 。第二大的数字是 2 。
- 示例 2
输入: s = "abc1111"
输出: -1
解释: 出现在 s 中的数字只包含 [1] 。没有第二大的数字。
提示:
1 <= s.length <= 500s只包含小写英文字母和(或)数字。
思路分析
根据题意可知,题目会给出一个混合字符串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)