一、问题描述
Write a function that takes a string as input and reverse only the vowels of a string.
Example 1:
Given s = "hello", return "holle".
Example 2:
Given s = "leetcode", return "leotcede".
Note:
The vowels does not include the letter "y".
二、我的解法
既然要颠倒,我就从头尾开始遍历字符串。从头部遍历的第一个元音替换成尾部遍历的第一个元音;如果不是元音则不替换。终止条件是从头遍历到尾一遍。
我的又臭又长的代码:
class Solution {
public String reverseVowels(String s) {
char[] c = s.toCharArray();
char[] retC = new char[c.length];
List<Character> vovels = new ArrayList<Character>();
vovels.add('a');
vovels.add('e');
vovels.add('i');
vovels.add('o');
vovels.add('u');
vovels.add('A');
vovels.add('E');
vovels.add('I');
vovels.add('O');
vovels.add('U');
int i, j;
for(i = 0, j = c.length - 1; i < c.length; i ++){
if(vovels.contains(s.charAt(i))){
while(j >= 0){
if(vovels.contains(c[j])){
retC[i] = c[j];
j --;
break;
}
j --;
}
}
else{
retC[i] = s.charAt(i);
}
}
return new String(retC);
}
}
三、淫奇技巧
见证自己代码和思路多烂的时候到了!
public class Solution {
public String reverseVowels(String s) {
if(s == null || s.length()==0) return s;
String vowels = "aeiouAEIOU";
char[] chars = s.toCharArray();
int start = 0;
int end = s.length()-1;
while(start<end){
while(start<end && !vowels.contains(chars[start]+"")){
start++;
}
while(start<end && !vowels.contains(chars[end]+"")){
end--;
}
char temp = chars[start];
chars[start] = chars[end];
chars[end] = temp;
start++;
end--;
}
return new String(chars);
}
思路上的差距: 我的思路是从头遍历一个一个动,找到元音后尾部移动到下一个元音,然后替换。然而人家是直接交换头尾!加起来遍历一遍就行了!
代码的差距:看看人家查找char是不是元音的方法!多高级多好写!再看看我的……
四、知识点
1. 查找char是否属于某个set的方法,除了Map以外,还有写一个String s=“abcde”,然后用s.contains(c + "")查找即可!具体内部实现的复杂度和HashMap有什么不同还需要深究一下~
2. char[]和String的转换方法:
char[] myString = new char[] {'T', 'H', 'I', 'S', ' ', 'I', 'S', ' ', 'T', 'E', 'S', 'T'};
String output1 = new String(myString);
System.out.println("output1 : " + output1);
String output2 = String.valueOf(myString);
System.out.println("\noutput2 : " + output2);
摘自:http://crunchify.com/java-two-ways-to-convert-char-array-to-string/
五、问题
暂无
六、碎碎念
这些题目还挺重视思维缜密度的。比如字符串为空;比如元音还有大小写的情况吖。
最近事情好多,刷题不能怂,抓紧抓紧