欢迎使用CSDN-markdown编辑器

String字符交换

用一个例子来讲,LeetCode上:
345. Reverse Vowels of a String,题目链接:https://leetcode.com/problems/reverse-vowels-of-a-string/description/

很简单一道题:按顺序交换字符串内存在的元音字母,思路很清晰,直接从首尾向中间循环推进,有就交换,无就继续推进~
代码很简单:

var reverseVowels = function (s) {
    var left = 0,
        right = s.length - 1;
    while (left < right) {
        if (isVowels(s[left]) && isVowels(s[right])) {
            var flag = s[left];
            s[left] = s[right];
            s[right] = flag;
            left++;
            right--;
        } else if (isVowels(s[left]) && !isVowels(s[right])) {
            right--;
        } else {
            left++;
        }
    }

    function isVowels(char) {
        if (char == 'a' || char == 'e' || char == 'i' || char == 'o' || char == 'u' || char == 'A' || char == 'E' || char == 'I' || char == 'O' || char == 'U')
            return true;
        else
            return false;
    }
    return s;
};

但是,最后却WA,why?黑人问号脸????

当我再尝试用控制台输入输出测试的时候,终于发现,字符串与数组是不同滴

当我们在数组内使用两数交换时,它是直接在数组内部修改数组,而当我们在字符串内使用两数交换时,它不会堆字符串造成任何变动!

所以造成了上面的代码不能使字符串发生改变。
改进方法:直接将字符串变为数组,在数组的基础上对其交换,再变为字符串提交~

AC Coding:

/**
 * @param {string} s
 * @return {string}
 */
var reverseVowels = function(s) {
    var left = 0,
        right = s.length - 1;
    var flag;
    var arr = s.split('');
    while (left < right) {
        if (isVowels(s[left]) && isVowels(s[right])) {
            swap(left, right);
            left++;
            right--;
        } else if (isVowels(s[left]) && !isVowels(s[right])) {
            right--;
        } else {
            left++;
        }
    }

    function isVowels(char) {
        if (char == 'a' || char == 'e' || char == 'i' || char == 'o' || char == 'u' || char == 'A' || char ==
            'E' || char == 'I' || char == 'O' || char == 'U')
            return true;
        else
            return false;
    }

    function swap(i, j) {
        flag = arr[i];
        arr[i] = arr[j];
        arr[j] = flag;
    }
    return arr.join('');   
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值