目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、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卷 200分 考生抽中题】
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。