一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
Hi, 大家好。我是新人,程序员库里。
今后会按类分享算法题。
今天给大家分享第11道leetcode上数组中使用双指针相关的算法题。
345. 反转字符串中的元音字母
leetcode地址:leetcode-cn.com/problems/re…
难度
简单
描述
给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 'a'、'e'、'i'、'o'、'u',且可能以大小写两种形式出现。
示例1
输入: s = "hello"
输出: "holle"
示例2
输入: s = "leetcode"
输出: "leotcede"
解法一
- 采用指针对撞的方法
- 先定义变量word,值是包括元音的大写字母和小写字母
- 定义变量arr,值是将字符串s转成数组
- 定义左指针left,初始值指向数组第一位
- 定义右指针,初始值指向数组最后一位
- 开始while循环,满足的条件是left小于right
- 当word中含有左指针指向的元素并且word中含有右指针指向的元素,此时将左指针和右指针指向的元素交换,交换后,将左指针向右移动一位,将右指针向右移动一位
- 当word中不含有左指针指向的元素,说明左指针指向的元素不是元音,将左指针向右移动一位,看下一个值是否是元音
- 当word中不含有右指针指向的元素,说明右指针指向的元素不是元音,将右指针向左移动一位,看下一个值是否是元音
- 遍历完后,数组中的元音交换完位置了
- 最后将数组转换为字符串返回
代码
/**
* @param {string} s
* @return {string}
*/
var reverseVowels = function(s) {
let word = "aeiouAEIOU";
let res = s.split("")
let left = 0 ,right = s.length-1;
while(left < right){
if(word.includes(res[left]) && word.includes(res[right])){
[res[left], res[right]] = [res[right], res[left]]
left++
right--
}
if(!word.includes(res[left])){
left++
}else if(!word.includes(res[right])){
right--
}
}
return res.join('');
};