华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天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 |
四、测试用例
1、输入
2
nezhastudyjavaveryhard
2、输出
5
3、说明
掌握核心编程思想,让你的编程不再烦恼。
开头是元音,结尾是元音,中间出现的非元音字符是瑕疵度。
符合要求的子串有:
- ezha
- astu
- avave
最长的是avave,长度5。
五、解题思路
核心思想:
开头是元音,结尾是元音,中间出现的非元音字符是瑕疵度
这道题的关键是正则表达式的合理使用。
六、Python算法源码
import redef main():import sysimport sys# 读取标准输入的所有行input_lines = sys.stdin.read().splitlines()# 读取瑕疵度flawflaw = int(input_lines[0])# 读取仅由字符a-z和A-Z组成的字符串str_input = input_lines[1]# 定义元音字母集合,包括大小写vowels = "aeiouAEIOU"# 构建正则表达式if flaw == 0:# 当瑕疵度为0时,匹配连续的至少一个元音字母regex = f"[{vowels}]+"else:# 当瑕疵度大于0时,匹配以元音字母开头和结尾,中间最多有flaw个非元音字母regex = f"[{vowels}](?:[^${vowels}]{{0,{flaw}}}[{vowels}])+"# 编译正则表达式pattern = re.compile(regex)# 寻找所有符合要求的子串matches = pattern.finditer(str_input)# 存储符合要求的子串的最大长度max_length = 0# 遍历所有匹配for match in matches:# 获取符合要求的子串matched_substring = match.group()# 更新最大长度if len(matched_substring) > max_length:max_length = len(matched_substring)# 输出符合要求的子串的最大长度print(max_length)if __name__ == "__main__":main()
七、JavaScript算法源码
// 引入readline模块以读取输入
const readline = require('readline');// 创建接口以读取标准输入
const rl = readline.createInterface({input: process.stdin,output: process.stdout
});let inputLines = [];
let currentLine = 0;// 读取所有输入行
rl.on('line', (line) => {inputLines.push(line);
});// 输入结束后执行的函数
rl.on('close', () => {// 读取瑕疵度flawlet flaw = parseInt(inputLines[0]);// 读取仅由字符a-z和A-Z组成的字符串let str = inputLines[1];// 定义元音字母集合,包括大小写const vowels = "aeiouAEIOU";// 构建正则表达式let regex = "";if (flaw === 0) {// 当瑕疵度为0时,匹配连续的至少一个元音字母regex = `[${vowels}]+`;} else {// 当瑕疵度大于0时,匹配以元音字母开头和结尾,中间最多有flaw个非元音字母regex = `[${vowels}](?:[^${vowels}]{0,${flaw}}[${vowels}])+`;}// 编译正则表达式const pattern = new RegExp(regex);// 寻找所有符合要求的子串const matches = str.matchAll(pattern);// 存储符合要求的子串的最大长度let maxLength = 0;// 遍历所有匹配for (const match of matches) {// 获取符合要求的子串let matchedSubstring = match[0];// 更新最大长度if (matchedSubstring.length > maxLength) {maxLength = matchedSubstring.length;}}// 输出符合要求的子串的最大长度console.log(maxLength);
});
八、C算法源码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <regex.h>int main(){int flaw;char str[1001]; // 假设输入字符串长度不超过1000// 读取瑕疵度flawscanf("%d", &flaw);// 读取仅由字符a-z和A-Z组成的字符串scanf("%s", str);// 定义元音字母集合,包括大小写char vowels[] = "aeiouAEIOU";// 构建正则表达式char regex[2000] = ""; // 足够大的缓冲区if(flaw == 0){// 当瑕疵度为0时,匹配连续的至少一个元音字母sprintf(regex, "[%s]+", vowels);}else{// 当瑕疵度大于0时,匹配以元音字母开头和结尾,中间最多有flaw个非元音字母sprintf(regex, "[%s](?:[^%s]{0,%d}[%s])+", vowels, vowels, flaw, vowels);}// 编译正则表达式regex_t regex_compiled;int reti = regcomp(®ex_compiled, regex, REG_EXTENDED);if (reti) {fprintf(stderr, "Could not compile regex\n");exit(1);}// 寻找所有符合要求的子串regmatch_t pmatch[1];int max_length = 0;const char *p = str;int offset = 0;while(regexec(®ex_compiled, p, 1, pmatch, 0) == 0){// 计算匹配的起始和结束位置int start = pmatch[0].rm_so + offset;int end = pmatch[0].rm_eo + offset;// 计算匹配的子串长度int length = end - start;if(length > max_length){max_length = length;}// 移动指针,避免重复匹配p += pmatch[0].rm_eo;offset += pmatch[0].rm_eo;}// 输出符合要求的子串的最大长度printf("%d\n", max_length);// 释放正则表达式的内存regfree(®ex_compiled);return 0;
}
九、C++算法源码
#include <bits/stdc++.h>
#include <regex>
using namespace std;int main(){int flaw;string str;// 读取瑕疵度flawcin >> flaw;// 读取仅由字符a-z和A-Z组成的字符串cin >> str;// 定义元音字母集合,包括大小写string vowels = "aeiouAEIOU";// 构建正则表达式string regex_str;if(flaw == 0){// 当瑕疵度为0时,匹配连续的至少一个元音字母regex_str = "[" + vowels + "]+";}else{// 当瑕疵度大于0时,匹配以元音字母开头和结尾,中间最多有flaw个非元音字母regex_str = "[" + vowels + "](?:[^" + vowels + "]{0," + to_string(flaw) + "}[" + vowels + "])+";}// 编译正则表达式regex pattern(regex_str);// 寻找所有符合要求的子串smatch match;string::const_iterator searchStart(str.cbegin());// 存储符合要求的子串的最大长度int max_length = 0;while(regex_search(searchStart, str.cend(), match, pattern)){// 获取符合要求的子串string matched_substring = match[0];// 更新最大长度if(matched_substring.length() > max_length){max_length = matched_substring.length();}// 移动搜索起始位置searchStart = match[0].second;}// 输出符合要求的子串的最大长度cout << max_length << endl;return 0;
}
🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)
🏆本文收录于,华为OD机试真题(Python/JS/C/C++)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。