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('');
};