在 HarmonyOS 应用开发者高级认证考试 时,我遇到了这道题目。它是一道经典的字符串处理问题,要求我们从给定字符串中找出 最长的元音子串长度。当时我的第一反应是,这题考察的是对字符串连续性问题的处理能力以及代码的优化设计。以下是我在考试中的完整思路和解题过程。
拿到题目后,我先快速梳理了一下要求,并明确了以下关键点:
a, e, i, o, u
和它们的大写版本 A, E, I, O, U
。基于这些分析,我迅速确定了一个基本思路:采用 线性遍历(O(n)) 来处理这个问题,这样可以在高效完成任务的同时保证代码逻辑的简洁性。
在设计算法时,我的主要思路是动态记录 当前连续元音长度 和 最长元音长度:
currentLength
:用于记录当前连续的元音子串长度。maxLength
:用于存储在遍历过程中发现的最长元音子串长度。Set
数据结构存储所有元音字符。相比数组,Set
的查找效率更高(时间复杂度 $O(1)$),可以更快速判断一个字符是否为元音。currentLength
加 1;maxLength
,并将 currentLength
重置为 0。maxLength
中存储的就是字符串中的最长元音子串长度。以下是我在考试中编写的代码:
function doFunc(s) {
let maxLength = 0; // 记录最长元音子串的长度
let currentLength = 0; // 当前连续元音子串的长度
const vowels = new Set(['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']); // 定义元音集合
// 遍历字符串
for (let i = 0; i < s.length; i++) {
if (vowels.has(s.charAt(i))) {
// 当前字符是元音
currentLength++; // 增加当前连续元音长度
maxLength = Math.max(maxLength, currentLength); // 更新最大值
} else {
// 当前字符不是元音
currentLength = 0; // 重置当前长度
}
}
return maxLength; // 返回最长元音子串长度
}
考试中,题目要求我们通过标准输入输出完成交互,因此我补充了以下代码来读取输入并输出结果:
process.stdin.resume();
process.stdin.setEncoding("utf8");
let input = "";
process.stdin.on("data", (data) => {
input += data;
});
process.stdin.on("end", () => {
let inputArray = input.split("\n");
let inputString = inputArray[0];
let result = doFunc(inputString); // 调用核心函数
console.log(result); // 输出结果
process.exit();
});
Set
数据结构,其查找时间复杂度为 $O(1)$。"hellothere"
2
(最长元音子串为 "e"
)。"beautifulday"
5
(最长元音子串为 "eau"
)。"aaaaa"
5
(整个字符串都是元音)。"bcdfg"
0
(没有元音)。"AeiOU"
- 输出:5
(元音子串为整个字符串,大小写不敏感)。
这些测试用例覆盖了各种情况,验证了代码的正确性和鲁棒性。在考试中,我通过这道题认识到以下几点:
Set
存储元音字符,提高了判断效率。最终,我的代码顺利通过了这道题,进一步让我体会到在面对复杂问题时,保持冷静、细致分析的重要性。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。