反转字符串中的元音字母

172 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

  • 给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
  • 元音字母包括 'a''e''i''o''u',且可能以大小写两种形式出现。
  • 示例 1:
    • 输入: s = "hello"
    • 输出: "holle"
  • 示例 2:
    • 输入: s = "leetcode"
    • 输出: "leotcede"
  • 提示:
    • 1 <= s.length <= 3 * 100000
    • s 由 可打印的 ASCII 字符组成

二、思路分析:

  • 首先将给定字符串转化为数组
  • 定义一个正则,用来判断数组中的哪些项是元音字母
  • 遍历数组,匹配出是元音字母的项
    • 将是元音字母的项添加进定义好的数组变量中
    • 将原数组中的元音字母项替换成undefined用来占位
  • 之前是按照元音字母在原字符串中出现位置添加进的数组,现在将数组反转
    • 当然,如果循环中用的unshift向数组添加的话,这一步可以省略,我也是写的时候刚刚想到,就不改了
  • 遍历之前的字符串数组,如果当前项是刚刚替换的undefined,就从元音字母的数组中从头开始取一个替换掉undefined
  • 上一步之后就已经得到反转元音字母后的数组了,遍历数组做字符串拼接返回即可

三、AC 代码:

function reverseVowels(s: string): string {
     let sArr = s.split('');
     let reg = new RegExp(/^[aeiou]/i);
     let words = [];
     for(let i = 0; i < sArr.length; i++){
         if(reg.test(sArr[i])){
             words.push(sArr[i]);
             sArr.splice(i, 1, undefined);
         }
     }
     words.reverse();
     for(let i = 0; i < sArr.length; i++){
         if(!sArr[i]){
             sArr[i] = words.splice(0,1)[0]
         }
     }
     let str = '';
     for(let i = 0; i < sArr.length; i++){
         str = str + sArr[i]
     }
     return str
};

四、总结:

  • 还需要注意下细节吧,比如将push方法替换成unshift方法,可以省略后的resverse操作,少一步操作就能多提升一点性能,是吧
  • 更多解题方式,移步题解区

image.png