Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
- 给你一个字符串
s,仅反转字符串中的所有元音字母,并返回结果字符串。 - 元音字母包括
'a'、'e'、'i'、'o'、'u',且可能以大小写两种形式出现。 - 示例 1:
- 输入: s = "hello"
- 输出: "holle"
- 示例 2:
- 输入: s = "leetcode"
- 输出: "leotcede"
- 提示:
1 <= s.length <= 3 * 100000s由 可打印的 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操作,少一步操作就能多提升一点性能,是吧 - 更多解题方式,移步题解区