题目要求:Write a function that takes a string as input and reverse only the vowels of a string
写一个函数具备以下功能:仅仅反转字符串中的元音字母(元音字母:a、e、i、o、u、A、E、I、O、U)
例:Given s = "hello", return "holle" Given s = "leetcode", return "leotcede".
方法一:
解题思路:
1.生成三个数组:newArray为最终的目标字符串的数组形式,numArray里的元素为元音字母在原String中的位置,charArray为String中的元音字母
2.若不是元音字母时,newArray的元素不变,若为元音字母时,则进行倒序操作
3.最后将数组转换成字符串输出
但是此解法的问题是可以解决单个单词,若为句子,及若输入字符串含有符合如逗号、句号等则会失效,于是对函数进行改进,详见解法二
<script type="text/javascript">
/**
* @param {string} s
* @return {string}
*这种方法只能处理单个单词,若为包含符号的一句话则会失效
*/
var reverseVowels = function(s) {
var s2String = s.toString();
var s2Array = s2String.split("");
var newArray = new Array();
var numArray = new Array();
var charArray = new Array();
var numString = "";
var charString = "";
for(var i = 0; i < s2Array.length; i++){
if (s2Array[i] == "a"||s2Array[i] =="e"||s2Array[i] =="i"||s2Array[i] =="o"||s2Array[i] =="u"||s2Array[i] =="A"||s2Array[i] =="E"||s2Array[i] =="I"||s2Array[i] =="O"||s2Array[i] =="U") {
numString = numString + i;
numArray = numString.split("");
charString = charString + s2Array[i];
charArray = charString.split("");
}
else{
newArray[i] = s2Array[i];
}
}
for(var i = 0; i < numArray.length; i++){
newArray[numArray[i]] = charArray[charArray.length-1-i];
}
var newString = "";
for(var i = 0; i < newArray.length; i++){
newString = newString + newArray[i];
}
alert(newString);
};
reverseVowels("leetcode");
</script>
解法二:
解题思路:1.遍历String,提取出String中的元音字母,并将其反转
2.反转后依次替换原来String中元音字母位置的字符(此方法使用了String.char(i)方法,可以从字符串中得到具体字符,避免了之前需将Stirng转换成Array进行遍历)
代码如下:
<script type="text/javascript">
var reverseVowels = function(s){
var s2Str = s.toString();
//反转字符串
var reverseStr = reverseString(s2Str);
//得到反转后的元音字母
var vowels = "";
for(var i = 0; i < s2Str.length; i++){
var c = reverseStr.charAt(i);
if (c=="a"||c=="A"||c=="e"||c=="E"||c=="i"||c=="I"||c=="o"||c=="O"||c=="u"||c=="U") {
vowels = vowels + c;
}
}
//替换
var t = 0;
var result = "";
for(var j = 0; j < s2Str.length; j++){
var c = s2Str.charAt(j);
if (c=="a"||c=="A"||c=="e"||c=="E"||c=="i"||c=="I"||c=="o"||c=="O"||c=="u"||c=="U") {
result = result + vowels.charAt(t);
t++;
}else{
result = result + c;
}
}
alert(result);
};
var reverseString = function(s) {
var w = s.toString();
var stringArray = new Array();
stringArray = w.split("");
stringArrayNew = stringArray.reverse();
var N = "";//必须在循环外声明
for(var i = 0; i < stringArrayNew.length;i++){
// var N = "";若在for循环里声明,即每次将清空N,则最后alert为"H"
N = N + stringArrayNew[i];
}
return N;
};
reverseVowels("A man,a plan,a canal:panama");
</script>