每日一题 -- leetCode1796

154 阅读3分钟

image.png 「这是我参与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];    //最后返回第二大的数

};
  • 正则表达式提取数字
  • 判空 直接返回
  • 遍历字符,转换成数组
  • 进行大到小排序
  • 最后返回第二大的数

总结

无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。