首页 > 其他分享 >【代码注释即解题思路】1796. 字符串中第二大的数字

【代码注释即解题思路】1796. 字符串中第二大的数字

时间:2023-12-18 14:05:49浏览次数:28  
标签:数字 最大数 大数 int 1796 解题 数组 字符串

一、题目描述

给你一个混合字符串 s ,请你返回 s第二大 的数字,如果不存在第二大的数字,请你返回 -1

混合字符串 由小写英文字母和数字组成。

示例 1:

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

示例 2:

输入:s = "abc1111"
输出:-1
解释:出现在 s 中的数字只包含 [1] 。没有第二大的数字。

提示:

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

来源:力扣(LeetCode) 链接:leetcode.cn/problems/se…

二、解题思路

第一遍读题的时候,想到的遍历一遍是把数字放到小顶堆里面进行排序……两个数好像不值得~

字符串包含英文字母和数字,首先要做的就是把英文字母筛选掉,单个字符可以转成ASCII码比较大小进行筛选。

字符串中共涉及到0-9这几个数字,数字范围是固定的,这时候可以使用桶排序的思想,创建一个数组,数组下标就是字符串中的数字,数组的值可以表示是否在字符串中遇到了这个数字。遇到数字的时候,把对应数组位置的值修改一下即可。

因为数组下标是有序的,最后把这个数组倒序遍历一遍,遇到第二个修改值的位置,把下标输出即可。

既然思路确定了,那么就开始写代码了

class Solution {
    public int secondHighest(String s) {
        // 从题目可以看到,涉及的数字只有0-9,所以可以使用一个数组存放结果,如果字符串中出现了这个数字,就在数组中标为1
        // 最后的时候,从大往小,遍历结果数组,遇到第二个存放1的位置,直接返回坐标即可
        int[] result = new int[10];
        char[] chars = s.toCharArray();
        for (char c : chars) {
            // 遍历字符串,过滤掉字母,数字直接作为数组下标
            if (c >= '0' && c <= '9') {
                result[c - '0'] = 1;
            }
        }
        // 需要一个标记,来区分是第一大还是第二大的数字
        boolean flag = false;
        // 遍历记录结果的数字
        for (int i = 9; i >= 0; i--) {
            // 如果存放的数字为1,说明字符串中有这个数字
            if (result[i] == 1) {
                // 如果标记为true,表示这是第二次遇到字符串中出现的数字,直接返回
                if (flag) {
                    return i;
                } else {
                    //第一次遇到字符串中出现的数字,此时是最大的数字
                    flag = true;
                }
            }
        }
        return -1;
    }
}
  • 时间复杂度:O(n),其中 n 表示字符串的长度,我们遍历一遍字符串和结果数组,结果数组的长度在时间复杂度中忽略。
  • 空间复杂度:O(1)。存放结果的数组长度是固定的。

【代码注释即解题思路】1796. 字符串中第二大的数字_数组

这地方使用int数组占用的空间还是比较多的,使用boolean类型的会更好一些。但是转念一想,这里只涉及到两个数字的变化:最大数和第二大数,那么我们是不是可以使用两个变量记录数字呢?

那么就遍历字符串遇到数字的时候就涉及到四种情况:

  1. 遇到的数字比最大数还要大,此时就要更新最大数和第二大数
  2. 遇到的数字跟最大数相等,此时最大数和第二大数都不需要更新
  3. 遇到的数字比最大数小,比第二大数大,此时只要更新第二大数
  4. 遇到的数字小于等于第二大数,此时最大数和第二大数都不需要更新

代码示例

class Solution {
    public int secondHighest(String s) {
        // max记录最大的数字,min记录第二大的数字
        int max = -1;
        int min = -1;
        char[] chars = s.toCharArray();
        for (char c : chars) {
            // 遍历字符串字符,如果是字母,直接跳过
            // 如果当前遇到的数字和最大的数字相等,直接跳过
            if (c > '9' || c - '0' == max) {
                continue;
            }
            // 字符串相减得到实际数字的值
            int temp = c - '0';
            // 如果当前遇到的数字比最大数还要大,则更新最大数和第二大数的值
            if (temp > max) {
                min = max;
                max = temp;
            } else if (temp > min) {
                // 如果当前遇到的数字比最大数小,比第二大数大,更新第二大数的值
                min = temp;
            }
        }
        return min;
    }
}
  • 时间复杂度:O(n),其中 n 表示字符串的长度,我们只需遍历一遍字符串。
  • 空间复杂度:O(1)。使用到的变量数量进一步减少

【代码注释即解题思路】1796. 字符串中第二大的数字_LeetCode_02

标签:数字,最大数,大数,int,1796,解题,数组,字符串
From: https://blog.51cto.com/u_15812995/8872899

相关文章

  • 【C语言】puts()字符串输出函数 | 自动换行
    ......
  • 【每日练习】将字符串翻转到单调递增、使字符串平衡的最少删除次数
    将字符串翻转到单调递增https://leetcode.cn/problems/flip-string-to-monotone-increasing/如果一个二进制字符串,是以一些0(可能没有0)后面跟着一些1(也可能没有1)的形式组成的,那么该字符串是单调递增的。给你一个二进制字符串s,你可以将任何0翻转为1或者将1翻转为0......
  • 438. 找到字符串中所有字母异位词
    1.题目介绍给定两个字符串 \(s\) 和\(p\),找到 \(s\) 中所有 \(p\) 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词指由相同字母重排列形成的字符串(包括相同的字符串)。示例 1:输入:s="cbaebabacd",p="abc"输出:[0,6]解释:起始索......
  • 浙江集训字符串专题
    \(\text{CF1207G}\)题目描述有\(n\)次操作,每一次操作描述了第\(i\)个字符串,要么是单独一个字符,要是是在第\(j\)个字符串后拼接一个字符得到。接下来又\(m\)次询问,每一次给出一个字符串问在第\(i\)个字符串中出现了多少次?思路考虑检出\(\text{ACAM}\)。一个字符串......
  • Java 字符串、数组、ArrayList转换
    Java字符串、数组、ArrayList之间的相互转换 数组转字符串importjava.util.Arrays;publicclassTest02{publicstaticvoidmain(String[]args){int[]scores1=newint[]{10,20,30,40,50};int[]scores2={10,20,30,40,50};//数......
  • string.replace()与removeprefix() 和 removesuffix()的区别 字符串技巧
    string.replace(),removeprefix()和removesuffix()是Python中的字符串方法,它们都用于修改字符串,但是它们的功能和使用方式有所不同:string.replace(old,new[,count]):这个方法会将字符串中的old子串替换为new子串。如果提供了可选参数count,则只替换前count个old子串¹......
  • 字符串基础
    字符串常用操作定义字符串时,单引号,双引号,三引号都可以 字符串拼接#字符串拼接s1='i's2='love's3='you's4=s1+''+s2+''+s3print(s4)s4=f'{s1}{s2}{s3}'print(s4)字符串切片对于字符串里的每个字符都有特定的位置索引s='testfan'从上......
  • 哈希表(HashMap)与字符串哈希
    哈希表哈希表是一种通过映射来快速查找的数据结构。其通过键值对(key-value)来存储。一个数据通过哈希函数的运算来生成一个属于他自己的键值,尔后将其与键值绑定。当我们想查找这个数据时,就可以直接通过键来访问对应的值,时间复杂度近似为O(1)。哈希表适用于这样一种场景,当数据......
  • 解决方案 | pywintypes.com_error: (-2147221005, '无效的类字符串', None, None) --P
     1背景importpythoncomimportwin32com.clientimportmathwincad=win32com.client.Dispatch("AutoCAD.Application")#强制打开cad,该句发生报错信息doc=wincad.ActiveDocumentdoc.Utility.Prompt("Hello!Autocadfrompywin32com.\n")msp=doc.Mode......
  • 【kmp算法】字符串匹配
    一,解决问题kmp算法解决的是字符串匹配的问题,具体来说假定我们要在主串s[]中匹配模式串p[],找到匹配到的位置loc;二,具体实现和演变过程最自然的想法是暴力写法(BF)枚举主串字符s[i],和模式串p[j]。一个一个匹配,如果匹配失败,i指针回退回起点,往前进一位,再次进行比较,......