华为OD机试 - 求满足条件的最长子串的长度 - 双指针(Java 2023 B卷 100分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求:
1、 只包含1个字母(a-z, A-Z),其余必须是数字;
2、 字母可以在子串中的任意位置;
如果找不到满足要求的子串,如全是字母或全是数字,则返回-1。

二、输入描述

字符串(只包含字母和数字)。

三、输出描述

子串的长度。

输入 输出 说明
abC124ACb 4 满足条件的最长子串是C124或者124A,长度都是4
a5 2 字符串本身就是满足要求的子串
aBB9 2 满足条件的为B9,长度为2
abcdef -1 没有满足条件的子串

四、解题思路

题读百遍,其义自见。

题意:

只包含1个字母(a-z, A-Z),其余必须是数字。

也就是说,我取到字符串中所有字母的下角标,相邻字母下角标差值最大,即是最长子串的长度。

这就简单了,果断上双指针,left表示要比较的相邻字母的开始字母下角标,right表示要比较的相邻字母的结束字母下角标。

求right - left的最大值即是结果。

五、Java算法源码

package com.guor.od;

import java.util.*;

public class OdTest02 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        int left = -1;
        int right = Integer.MAX_VALUE;
        int max = 0;
        for (int i = 0; i < input.length(); i++) {
            char c = input.charAt(i);
            // 判断是字母
            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                // 第一个字母
                if(left == -1){
                    left = i;
                }else{
                    right = i;
                    // 取两字母的最大下角标差
                    if(right - left > max){
                        max = right - left;
                    }
                    left = right;
                }
            }
        }
        System.out.println(max);
    }
}

六、效果展示

1、输入

abC124ACb

2、输出

4

3、说明

华为OD机试 - 求满足条件的最长子串的长度 - 双指针(Java 2023 B卷 100分)_第1张图片


下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,java,开发语言,双指针)