「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」
前言
每日一题,轻松解题
每日一题为刷题系列 每日刷一题LeetCode题,并且对题目进行分析,分享思路。
正文
:字符串中第二大的数字
难度:简单
题目要求:
给你一个混合字符串 s ,请你返回 s 中 第二大 的数字,如果不存在第二大的数字,请你返回 -1 。
混合字符串 由小写英文字母和数字组成。
举个例子
输入: s = "dfa12321afd"
输出: 2
解释: 出现在 s 中的数字包括 [1, 2, 3] 。第二大的数字是 2 。
:解题
理清思路:
这道题比较简单,就用两种方法来处理
分析:
方法一:遍历字符串,限定范围,只查询数字,定义两个变量,存放最大值和第二大的值,依次遍历找到第二大的数字。 考虑边界条件, 没有数字或者没有第二大的数字。
方法二:用正则表达式提取出数字;把字符转换为数字;进行排序, 返回第二个大的;考虑边界条件, 没有数字或者没有第二大的数字。
编辑代码:
方法一
var secondHighest = function(s) {
let max = -1 //max为最大值
let sec = -1 //sec为第二大的值
for (let b of s) { //遍历字符串,过滤数字以外的字符
if (b >= 0 && b <= 9) {
if (b > max) sec = max, max = b //当b大于max时,就把max赋值给sec b赋值给max 因为b现在是最大值了
if (b < max && b > sec) sec = b //如果小于最大值,大于第二大时,就把b赋值给sec
}
}
if(sec === -1){
return -1
}
return sec
};
- max为最大值
- sec为第二大的值
- 遍历字符串,过滤数字以外的字符
- 当b大于max时,就把max赋值给sec b赋值给max 因为b现在是最大值了
- 如果小于最大值,大于第二大时,就把b赋值给sec
- 最后返回一个sec 当sec = -1 时说明数字只有一个或者没有
方法二
ar secondHighest = function(s) {
let a = s.match(/\d/g); //正则表达式提取数字
if (a == null) return -1; //判空 直接返回
a.forEach((item, index) => { //遍历字符,转换成数组
a[index] = parseInt(a[index]);
});
a.sort((a, b) => b - a); //进行大到小排序
let s1 = new Set(a);
s2 = Array.from(s1);
if (s2.length == 1) return -1;
return s2[1]; //最后返回第二大的数
};
- 正则表达式提取数字
- 判空 直接返回
- 遍历字符,转换成数组
- 进行大到小排序
- 最后返回第二大的数
总结
无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。