简单-LeetCode 345.反转字符串中的元音字母

题目

来源:反转字符串中的元音字母
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例:
在这里插入图片描述

解题思路及代码
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(’ ')将字符串数组变为字符串,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值