难度:简单
题目:
给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 'a'、'e'、'i'、'o'、'u',且可能以大小写两种形式出现不止一次。
示例 1:
输入:s = "hello"
输出:"holle"
示例 2:
输入:s = "leetcode"
输出:"leotcede"
提示:
- 1 <= s.length <= 3 * 105
- s 由 可打印的 ASCII 字符组成
解题:
个人:
关键:双指针
- 元音字母为 'a'、'e'、'i'、'o'、'u'
- 反转元音字母,指的是在字符串内,从左往右的第一个元音与从右往左的第一个元音进行互换
- 所以需要两个指针,分别左右开始循环,某一个遇到了元音,则等另一个遇到元音,都遇到后就互换,然后分别继续循环
var isYuanYin = function (s) {
const yuanyin = ["a", "e", "i", "o", "u"];
return yuanyin.includes(s.toLowerCase());
};
var reverseVowels = function (s) {
let left = 0;
let right = s.length - 1;
s = s.split(""); // 转为数组,方便位置调换
// 当左侧小于右侧时,说明还未循环完
// 当左侧大于右侧时,说明已经循环完
while (left < right) {
// 左侧的是否为元音
const leftYY = isYuanYin(s[left]);
// 右侧的是否为元音
const rightYY = isYuanYin(s[right]);
if (leftYY && rightYY) {
// 当左右都是元音时,进行互换
const temp = s[left];
s[left] = s[right];
s[right] = temp;
// 互换完成后,进行位移
left++;
right--;
} else {
// 左侧不为元音时,向右位移一位
if (!leftYY) left++;
// 右侧不为元音时,向左位移一位
if (!rightYY) right--;
}
}
return s.join("");
};
执行用时,消耗内存
76 ms,56.68 MB
耗时:20 min
官方:
关键:双指针
思路:跟我的一样,不赘述
总结:
第一次是知道了解决算法的名称,在知道了“双指针”后,细节也就慢慢写出来了