目录
华为OD机试 2023B卷题库疯狂收录中,刷题++点这里++
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
开头和结尾都是元音字母(aeiouAEIOU)的字符串为元音字符串,其中混杂的非元音字母数量为其瑕疵度。
比如:
- "a" 、 "aa"是元音字符串,其瑕疵度都为0
- "aiur"不是元音字符串(结尾不是元音字符)
- "abira"是元音字符串,其瑕疵度为2
给定一个字符串,请找出指定瑕疵度的最长元音字符子串,并输出其长度,如果找不到满足条件的元音字符子串,输出0。
子串:字符串中任意个连续的字符组成的子序列称为该字符串的子串。
二、输入描述
首行输入是一个整数,表示预期的瑕疵度flaw,取值范围[0, 65535]。
接下来一行是一个仅由字符a-z和A-Z组成的字符串,字符串长度(0, 65535]。
三、输出描述
输出为一个整数,代表满足条件的元音字符最长子串的长度。
输入 | 输出 | 说明 |
---|---|---|
0 asdbuiodevauufgh | 3 | uio为瑕疵度为0的最长子串,故长度为3 当然auu也是 |
2 aeueo | 3 | 0 |
四、解题思路
核心思想:
开头是元音,结尾是元音,中间出现的非元音字符是瑕疵度
这道题的关键是正则表达式的合理使用。
五、Java算法源码
java
package com.guor.od;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class OdTest01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 预期的瑕疵度flaw
int flaw = Integer.valueOf(scanner.nextLine());
// 仅由字符a-z和A-Z组成的字符串
String str = scanner.nextLine();
// 开头是元音 结尾是元音 中间出现的非元音字符是瑕疵度
String regex = "";
if (flaw == 0) {
regex = "[aeiouAEIOU]{1,}";
} else {
regex = "[aeiouAEIOU]{1}";
for (int i = 0; i < flaw; i++) {
regex += "[^aeiouAEIOU]{1}[aeiouAEIOU]*";
}
regex += "[aeiouAEIOU]{1}";
}
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
// 符合要求的字符串的最大长度
int max = 0;
// 寻找符合要求的字符串
while (matcher.find()) {
// 符合要求的字符串
System.out.println(str.substring(matcher.start(), matcher.end()));
// 获取符合要求的字符串的最大长度
if (matcher.end() - matcher.start() > max) {
max = matcher.end() - matcher.start();
}
StringBuilder sb = new StringBuilder(str);
sb.setCharAt(matcher.start(), '_');
str = sb.toString();
matcher = pattern.matcher(str);
}
System.out.println("长度:" + max);
}
}
六、效果展示
1、输入
2
nezhastudyjavaveryhard
2、输出
5
3、说明
掌握核心编程思想,让你的编程不再烦恼。
开头是元音,结尾是元音,中间出现的非元音字符是瑕疵度。
符合要求的子串有:
- ezha
- astu
- avave
最长的是avave,长度5。
🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。