第一种方法
const reverseVowels = (s) => {
let vowels = s.replace(/[^AaEeIiOoUu]/g, ''); // 1)将非元音的字母过滤掉
let count = vowels.length - 1;
let str = '';
for(let i = 0; i < s.length; i++) { // 2) 使用str变量来接收翻转后的结果
str += /[AaEeIiOoUu]/.test(s[i]) ? vowels[count--] : s[i];
}
return str;
};
第二种方法:双指针
const reverseVowels = (s) => {
s = s.split('');
let left = 0;
let right = s.length - 1;
const regRex = /[aeiouAEIOU]/;
while(left < right) {
!regRex.test(s[left]) && left++;
!regRex.test(s[right]) && right--;
if(regRex.test(s[left]) && regRex.test(s[right])) {
[s[left++], s[right--]] = [s[right], s[left]];
}
}
return s.join('');
};
第三种方法
核心: left和right指针需一直遍历到找到元音字母
const reverseVowels = (s) => {
s = s.split('');
let left = 0;
let right = s.length - 1;
const regRex = /[aeiouAEIOU]/;
while(left < right) {
while(left < right && !regRex.test(s[left])) {
left++;
};
while(left < right && !regRex.test(s[right])) {
right--;
};
[s[left++], s[right--]] = [s[right], s[left]];
}
return s.join('');
};