题目
来源:反转字符串中的元音字母
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例:
解题思路及代码
1.思路
先说一下自己一开始想的思路:将字符串翻转之后,遍历新字符串,取出其中元音字母,并依次存入数组。然后遍历原字符串,遇到元音字母时取出数组中第一个元素并取代该元音字母,代码如下:
var reverseVowels = function(s) {
var newS = s.split("").reverse().join("");
var arr1 = [];
var cur = 0;
for (let i = 0; i < s.length; i++) {
if (newS[i] == 'a' ||newS[i] == 'o' || newS[i] == 'e' || newS[i] == 'i' || newS[i] == 'u' || newS[i] == 'A' ||newS[i] == 'O' || newS[i] == 'E' || newS[i] == 'I' || newS[i] == 'U') {
arr1.push(newS[i]);
}
}
for (let i = 0; i < s.length; i++) {
if (s[i] == 'a' ||s[i] == 'o' || s[i] == 'e' || s[i] == 'i' || s[i] == 'u' || s[i] == 'A' ||s[i] == 'O' || s[i] == 'E' || s[i] == 'I' || s[i] == 'U') {
cur = arr1.shift();
s = replacePart(s, i , cur);
}
}
return s;
};
var replacePart = function(str, i, b) {
var pos = i;
return str.slice(0,pos) + b + str.slice(pos+1);
}
注意 在取代原字母的时候,一开始写的是
s[i] = cur;
!!! 忘了在javascript中,字符串是不可更改的! 所以写了下面的replacePart函数。虽然通过了,但是结果。。。。
双指针思路
定义两个指针,分别从字符串的两端开始遍历字符串,当两个指针指向的字母均为元音字母时,交换对应的两个字母。
2. 代码
var reverseVowels = function(s) {
var replacePart = function(str, i, b) {
var pos = i;
return str.slice(0,pos) + b + str.slice(pos+1); */
var set = new Set(['a','o','e','i','u','A','O','E','I','U']);
var i = 0;
var j = s.length - 1;
var arr = s.split('');
while (i < j) {
if (set.has(arr[i])) {
while (!set.has(arr[j]) && i < j) {
j--;
}
[arr[i], arr[j]] = [arr[j], arr[i]];
j--;
}
i++;
}
return arr.join('');
}
问题在定义set的时候遇到了问题,比较两种方式的差别:
(1)
(2)
同时!!! 虽然 不能直接对字符串进行操作 s[i] = arr1.shift(); 可以利用 s.split(’ ‘)将字符串变为字符串数组,即可这样进行操作,最后通过s.join(’ ')将字符串数组变为字符串,