一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
一、题目
给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 'a'、'e'、'i'、'o'、'u',且可能以大小写两种形式出现。
示例 1:
输入:s = "hello"
输出:"holle"
示例 2:
输入:s = "leetcode"
输出:"leotcede"
作者:力扣 (LeetCode) 链接:leetcode-cn.com/leetbook/re… 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
二、思路
暴力解法
- 先将字符串转换成数组
- 定于新的元音数组,通过循环把所有的字符串的元音字符按顺序push进数组
- 将元音数组翻转
- 再次循环元音字符组成的元音数组,每遇到语音就将新的元音数组替换过去
双指针思路
- 首先先将字符串转化成数组
- 判断左指针不存在元音字母的时候,左指针向右移动
- 判断右指针不存在元音字母的时候,右指针向左移动
- 当左指针遇到元音字母的时候停下,右指针继续向左移动,直到遇到元音字母
- 然后更换左右指针元音字母的位置,左右指针继续移动,直到条件不成立
三、代码
暴力解法
这道题主要是考察的双指针,暴力解法很简单,因为创建了新的数组空间,因此不在写代码
双指针代码
let s = "hello"
let reverseVowels = function(s) {
/**
* 首先先将字符串转化成数组
*
* 双指针
* 判断左指针不存在元音字母的时候,左指针向右移动
* 判断右指针不存在元音字母的时候,右指针向左移动
* 当左指针遇到元音字母的时候停下,右指针继续向左移动,直到遇到元音字母
* 然后更换左右指针元音字母的位置,左右指针继续移动,直到条件不成立
* */
let left = 0, right = s.length - 1
const arr = Array.from(s)
while(left < right) {
if(!"aeiouAEIOU".includes(arr[left])) {
left++
}
if(!"aeiouAEIOU".includes(arr[right])) {
right--
}
if("aeiouAEIOU".includes(arr[left]) && "aeiouAEIOU".includes(arr[right])) {
const a = arr[left]
arr[left] = arr[right]
arr[right] = a
left++
right--
}
}
return arr.join('')
}