LeetCode 345. 反转字符串中的元音字母

第一种方法

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('');
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值