目录
1 题目
https://leetcode-cn.com/problems/reverse-vowels-of-a-string/
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
2示例
示例 1:
输入: "hello"
输出: "holle"
示例 2:
输入: "leetcode"
输出: "leotcede"
说明:
元音字母不包含字母"y"。
3解答:双指针法
在JS中,字符串时不可变的,为了方便字符串中字符的改变,所以需要将字符串转换成数组。
设置首尾指针left和right,left从左往右遍历字符串数组,right从右往左遍历字符串数组,当两者指向元音字符时,则交换这两个字符。具体解析:当left <=right然后做以下操作
如果left和right指向的字符是元音字符,则交换它们,同时left往右移动,right往左移动;
如果left指向的字符不是元音字符,left往右移动;
如果right指向的不是元音字符,right往左移动。
4代码
"use strict";
/**
* @param {string} s
* @return {string}
*/var reverseVowels = function(s) {
var vowelsStr = "aeiouAEIOU"; //元音字母字符串
s = s.split(""); //因为字符串不可更改的特性,将字符串转为数组会更好操作
var left = 0; //左指针,从下表0开始,从左往右遍历
var right = s.length - 1; //右指针,指向字符串数组s的最后一个字符,从右往左遍历
while(left <= right){
if(vowelsStr.indexOf(s[left])!==-1 && vowelsStr.indexOf(s[right])!==-1){
//如果left和right指向元音字符,则交换它们,同时left往右移动,right往左移动;
var temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}else if(vowelsStr.indexOf(s[left])===-1){
//如果left指向的字符不是元音字符,left往右移动;
left++;
}else{
//如果right指向的不是元音字符,right往左移动。
right--;
}
}
return s.join(""); //将数组转换成字符串
};
//注意这里外层while循环的条件在进入循环体之后就不能作为内层循环条件
function reverseVowels(str) {
let vowels = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'];
let strToArr = str.split('');
let left = 0; //左指针,从左开始遍历
let right = strToArr.length - 1; //右指针
let temp;
while(left < right){
while (vowels.indexOf(strToArr[left]) === -1 && left < right){
/*如果这里不设置left< right,将会得到想象不到的结果
因为这里不设置这个条件,那么开始的时候,left< right,会满足外层循环条件,进入循环体
但在内层循环的时候,可能会出现left>right,虽然不满足外层条件,但是还是会执行内层循环体
* */
//原因:因为满足外层循环条件之后,必须会执行外层循环体一次,之后才会再判断条件
left++;
}
while (vowels.indexOf(strToArr[right]) === -1 && left < right){
right--;
//continue;
}
temp = strToArr[left];
strToArr[left] = strToArr[right];
strToArr[right] = temp;
left++;
right--;
}
return strToArr.join('');
}
let rel = reverseVowels('leetcode');
console.log(rel)