3 JavaScript实现leetcode--双指针法:反转字符串中的元音字符

目录

1 题目

2示例

3解答:双指针法

4代码


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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值